一个POST操作的多个视图模型

时间:2016-03-17 02:58:20

标签: asp.net-mvc-5 model-binding

是否可以使用相同的post动作,但有两种不同的模型,使用的模型由当前用户的角色决定?我已经将我的真实场景简化为下面的示例,但我的想法是我有两个角色:经理和区域。管理员可以添加一个记录(让我们只是说它是这个例子中的用户)只有名字和姓氏。另一方面,区域可以与管理器相同,但还必须添加存储在嵌套视图模型和值类型属性上的多个其他信息,以及必要的数据注释。

我想使用这些单独的视图模型和视图,这样我就不必根据角色进行空检查或条件必需属性。另外,正如斯蒂芬在下面指出的那样,第二种/不同名称的动作方法也有效,但如果路线可以保持不变(用户/添加),那就太好奇了。

以下是我尝试的内容:

控制器

public ActionResult Add()
{
    if (User.IsInRole("Regional"))
        return View("AddRegional", new AddRegionalViewModel());

    return View("Add", new AddViewModel());
}

[HttpPost]
public ActionResult Add(AddViewModel addViewModel)
{
    // process manager add command

    return RedirectToAction("List");
}

[HttpPost]
public ActionResult Add(AddRegionalViewModel addRegionalViewModel)
{
    // process regional add command

    return RedirectToAction("List");
}

查看模型

public class AddViewModel
{
    [Required]
    public string First { get; set; }

    [Required]
    public string Last { get; set; }
}

public class AddRegionalViewModel
{
    [Required]
    public string First { get; set; }

    [Required]
    public string Last { get; set; }

    [Required]
    public string Email { get; set; }

    // in reality there are a LOT more value types / nested view models here
}

视图

Add.cshtml

@model ModelBindingHell.ViewModels.AddViewModel

@{
    ViewBag.Title = "Add";
}

<h2>Add</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <div class="form-group">
            @Html.LabelFor(model => model.First)
                @Html.EditorFor(model => model.First)
                @Html.ValidationMessageFor(model => model.First)
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Last)
            @Html.EditorFor(model => model.Last)
            @Html.ValidationMessageFor(model => model.Last)
        </div>

        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
}

AddRegional.cshtml

@model ModelBindingHell.ViewModels.AddRegionalViewModel

@{
    ViewBag.Title = "Add";
}

<h2>Add</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <div class="form-group">
            @Html.LabelFor(model => model.First)
            @Html.EditorFor(model => model.First)
            @Html.ValidationMessageFor(model => model.First)
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Last)
            @Html.EditorFor(model => model.Last)
            @Html.ValidationMessageFor(model => model.Last)
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Email)
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
}

0 个答案:

没有答案