Как различать выделение и сохранение в MVC post

#c# #asp.net-mvc #post

#c# #asp.net-mvc #Публикация

Вопрос:

У меня есть форма, в которой есть выпадающий список для выбора пользователей и форма для пользовательских данных. Все элементы управления вложены в форму.

Выпадающий список пользователя Cureently отправляет форму для уведомления о выборе пользователя для извлечения соответствующих данных.

Я хочу иметь тип кнопки (отправить), который сохраняет данные для текущего пользователя. Поскольку оба элемента управления находятся в одной и той же форме, и они оба отправляют, как я могу отличить, пытаюсь ли я выбрать пользователя или сохранить данные в своем действии?

Я попытался создать две формы следующим образом:

 @model MyApp.Models.UserModel
@{
    ViewBag.Title = "Profiles";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<script type="text/javascript" src="chosen.jquery.js"></script>
<script type="text/javascript" src="bootstrap-switch.js"></script>

<link rel="stylesheet" href="chosen.css" />
<link rel="stylesheet" href="bootstrap-switch.css" />
<style type="text/css">
    .chosen-search{
        display: none;
    }
    .form-group label{
        margin-top: 10px;
    }
    .row{
        margin-bottom: 20px;
    }
    th{
        text-align: center;
    }
</style>
<script type="text/javascript">
    $(document).ready(function ()        {
    $('#CurrentUserId').chosen({placeholder_text_single: "Select a user"});
    $('#CurrentGroupId').chosen({placeholder_text_single: "Select a group"});
    $('#CurrentRoleId').chosen({placeholder_text_single: "Select a role"});

    $('#IsActive').bootstrapSwitch({
        onColor: "success",
        offColor: "danger",
        onText: "ACTIVE",
        offText: "PASSIVE",
        animate: false,
        handleWidth: 60
    });
    $('.authorizationCheckBox').bootstrapSwitch({
        onColor: "success",
        offColor: "danger",
        onText: "Y",
        offText: "N",
        animate: false,
        size: "mini"
    });
});
</script>
@using (Html.BeginForm("Profile", "User"))
{
    @Html.AntiForgeryToken()
    <div class="row">
        <div class="col-sm-3">
            <div class="row">
                <label class="control-label">Selected user :</label>
            </div>
        </div>
        <div class="col-sm-9">
            <div class="row">
                @Html.DropDownListFor(x => x.CurrentUserId, new SelectList(Model.AllUsers, "Id", "Username"), "", new { @class = "form-control", onchange = @"this.form.submit();" })
            </div>
        </div>
    </div>
}
@using (Html.BeginForm("SaveProfile", "User"))
{
    if (!string.IsNullOrWhiteSpace(Model.CurrentUser))
    {
    <div class="row">
        <div class="col-sm-3">
            <div class="row">
                @if (string.IsNullOrWhiteSpace(Model.UserImageUrl))
                {
                    <img src="no-user.png" class="img-circle" alt="..." style="width: 35%; display: block; margin: auto;">
                    <button type="button" class="btn btn-primary" style="display: block; margin: auto; margin-top: 10px;">
                        <span class="glyphicon glyphicon-upload"></span>amp;nbsp;amp;nbsp;Upload avatar
                    </button>
                }
                else
                {
                    <img src="@Model.UserImageUrl" class="img-circle" alt="..." style="width: 35%; display: block; margin: auto;">
                    <button type="button" class="btn btn-primary" style="display: block; margin: auto; margin-top: 10px;">
                        <span class="glyphicon glyphicon-retweet"></span>amp;nbsp;amp;nbsp;Change avatar
                    </button>
                }
            </div>
            <div class="row">
                <div class="input-group" style="margin: 0 auto;">
                    <div class="switch-button xlg showcase-switch-button">
                        @Html.CheckBoxFor(x => x.IsActive)
                    </div>
                </div>
            </div>
        </div>
        <div class="col-sm-9">
            <div class="row">
                <div class="form-group">
                    <label class="control-label col-sm-2">Username :</label>
                    <div class="col-sm-10">
                        <input id="CurrentUser" name="CurrentUser" class="form-control form-control-flat" value="@Model.CurrentUser" />
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="form-group">
                    <label class="control-label col-sm-2">E-mail :</label>
                    <div class="col-sm-10">
                        <input id="EMail" name="EMail" class="form-control form-control-flat" value="@Model.EMail" />
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="form-group">
                    <label class="control-label col-sm-2">Membership :</label>
                    <div class="col-sm-10">
                        @Html.DropDownListFor(x => x.CurrentGroupId, new SelectList(Model.AllGroups, "Id", "Name"), "", new { @class = "form-control" })
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="form-group">
                    <label class="control-label col-sm-2">Role :</label>
                    <div class="col-sm-10">
                        @Html.DropDownListFor(x => x.CurrentRoleId, new SelectList(Model.AllRoles, "Id", "Name"), "", new { @class = "form-control" })
                    </div>
                </div>
            </div>
        </div>
    </div>
    <button id="btnSave" type="submit" class="btn btn-info" style="float: right; margin-right: 10px; margin-bottom: 40px;">
        <span class="glyphicon glyphicon-trash"></span>Save changes
    </button>
    }
}

[HttpGet]
public ActionResult Profile()
{
    return View(CreateInitialUserModel());
}
[HttpPost]
public ActionResult Profile(UserModel model)
{
    model = GetUserModel(model.CurrentUserId.Value);
    ModelState.Clear();

    return View(model);
}
[HttpPost]
public ActionResult SaveProfile(UserModel model)
    {
        SaveModel(model)

        return RedirectToAction("Profile");
    }
 

Но проблема в том, что при HttpPost действия профиля работают хорошо. Но когда я нажимаю кнопку сохранения и вызывается действие HttpPost SaveProfile, модель входных параметров не имеет значений, установленных на экране.

Комментарии:

1. Почему бы не поместить выпадающий список в отдельную форму? Вся проблема дифференциации исчезнет.

2. Я попробовал это и обновил свой вопрос структурой и результатами.

3. модель входных параметров не имеет значений, установленных на экране , тогда что-то не так с привязкой данных. Не могли бы вы показать, как вы создаете пользовательскую форму?

4. Определенно, с данными что-то происходит, но я не могу понять, что именно. Я обновил код.

5. Измените все <input> на @Html.TextBoxFor(m => m.Property) . Например. @Html.TextBoxFor(m => m.CurrentUser) . Вы можете писать старые простые <input> теги, но помощники HTML предлагают более простой способ создания форм.

Ответ №1:

На самом деле я бы использовал две формы. Это не только снимает вашу проблему, поскольку вы можете просто добавить скрытое поле или что-то в каждую форму, чтобы указать, какое из них было отправлено, но и предотвращает другие проблемы, с которыми вы, вероятно, столкнетесь, например, сбой проверки любых обязательных пользовательских полей в форме создания, когда вы просто выбираете пользователя,потому что для этих полей не было отправлено никаких данных.

Короче говоря, просто используйте любой JavaScript, который вы уже используете, для автоматической отправки при выборе опции из выпадающего списка, чтобы изменить значение скрытого поля или иным образом изменить данные post перед его отправкой.

Комментарии:

1. Я попробовал это и обновил свой вопрос структурой и результатами.

2. Использование отдельных форм не означает использование отдельных действий .

3. Если я использую одно и то же действие, они оба попадают в одно и то же действие. Что мне делать? Извлекать данные одного пользователя или обновлять данные текущего пользователя?

Ответ №2:

Почему бы не использовать jquery для извлечения данных? Вместо этого вы можете переключить выпадающий список на вызов функции jquery, которая выполняет ajax-вызов метода контроллера, который извлекает соответствующие пользовательские данные. Затем вы можете привязать данные к соответствующим полям на странице с помощью jquery. Тогда у вас будет только одна кнопка отправки в вашем представлении, обрабатываемая с помощью обычного процесса формы mvc.

Комментарии:

1. Допустим, я пытаюсь выполнить avioid с помощью jQuery в этом примере.

2. Ну, другим вариантом было бы добавить скрытое поле в формы, как упоминали другие, или включить дополнительный параметр в ваш объект route values в Html.BeginForm. Затем вы можете использовать метод single controller, добавив необязательный параметр, для которого вы можете выполнять проверки, чтобы решить, хотите ли вы получить пользовательские данные или сохранить пользовательские данные.

Ответ №3:

-в событии изменения выпадающего списка вы должны сохранить идентификатор пользователя в переменной, такой как глобальная переменная или скрытые поля. -Создать кнопку

в функции =

 function submitvalues()
{

//get stored userID here from variable 

//perform submit here

}