繁体   English   中英

通过验证创建具有多个模型和表单的视图-MVC 5

[英]Create View with Multiple Models and Forms with Validation - MVC 5

如何创建具有多个需要验证的模型并且还具有多个表单以在同一视图中提交所有视图的视图?

我有下面的解决方案。 在输入时,我能够弄清楚,希望对其他人有帮助。 如果其他人有更好的方法或评论,请随时发布!

我有一个包含ViewModel的视图,该视图结合了2个模型。 这是ViewModel,以及其他类:

public class PlayerFormViewModel
{
    public PlayerFormEnglish PlayerFormEnglish { get; set; }
    public PlayerFormSpanish PlayerFormSpanish { get; set; }
}

public class PlayerFormEnglish : PlayerFormInformation { }

public class PlayerFormSpanish : PlayerFormInformation { }

public class PlayerFormInformation
{
    [Required(ErrorMessage = "First name is a required field.")]
    [Display(Name = "First name")]
    public string FirstName { get; set; }

    // Used as a dropdown in the view
    [Display(Name = "Gender")]
    public IEnumerable<SelectListItem> Gender{ get; set; }
}

我的主视图包含ViewModel和2种形式:

@model Namespace.Models.PlayerFormViewModel

@using (Html.BeginForm("PlayerTest", "Profile"))
{
    @Html.AntiForgeryToken()

        <h3>English</h3>

        @Html.LabelFor(m => m.PlayerFormEnglish.FirstName)
        @Html.TextBoxFor(m => m.PlayerFormEnglish.FirstName)
        @Html.ValidationMessageFor(m => m.PlayerFormEnglish.FirstName)

        @Html.LabelFor(m => m.PlayerFormEnglish.Gender)
        @Html.DropDownListFor(m => m.PlayerFormEnglish.Gender, new SelectList(Model.PlayerFormEnglish.Gender, "Value", "Text"))

        <button type="submit" class="btn btn-default" name="ButtonType" value="SaveEnglishForm">Save</button>
}

@using (Html.BeginForm("PlayerTest", "Profile"))
{
    @Html.AntiForgeryToken()

        <h3>Spanish</h3>

        @Html.LabelFor(m => m.PlayerFormSpanish.FirstName)
        @Html.TextBoxFor(m => m.PlayerFormSpanish.FirstName)
        @Html.ValidationMessageFor(m => m.PlayerFormSpanish.FirstName)

        @Html.LabelFor(m => m.PlayerFormSpanish.Gender)
        @Html.DropDownListFor(m => m.PlayerFormSpanish.Gender, new SelectList(Model.PlayerFormEnglish.Gender, "Value", "Text"))

        <button type="submit" class="btn btn-default" name="ButtonType" value="SaveSpanishForm">Save</button>
}

当页面首次加载时,我会预先填充以下字段:

[HttpGet]
public ActionResult PlayerTest()
{
    PlayerFormViewModel model = new PlayerFormViewModel();
    model.PlayerFormEnglish = new PlayerFormEnglish();
    model.PlayerFormSpanish = new PlayerFormSpanish();
    model.PlayerFormEnglish.FirstName = "Brad";

    List<SomeObject> genderList = GetDataForDropdown();

    model.PlayerFormEnglish.Gender = ConvertData(genderList);
    model.PlayerFormSpanish.Gender = ConvertData(genderList);
    return View(model);
}

最后,当用户单击“保存”按钮时,我将验证并更新保存的表单:

[HttpPost]
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult PlayerTest(PlayerFormViewModel model, string ButtonType)
{
    if (ButtonType.Equals("SaveEnglishForm"))
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("SuccessfulSave", "Profile");
        }
        model.PlayerFormSpanish = new PlayerFormSpanish();
    }
    else
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("SuccessfulSave", "Profile");
        }
        model.PlayerFormEnglish = new PlayerFormEnglish();
    }

    // I can repopulate the fields here just as before
    model.PlayerFormEnglish.FirstName = "Brad";

    List<SomeObject> genderList = GetDataForDropdown();

    model.PlayerFormEnglish.Gender = ConvertData(genderList);
    model.PlayerFormSpanish.Gender = ConvertData(genderList);

    // Return model which will mark the required fields in the UI
    return View(model);
}

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM