如何在MVC视图中管理不同模型的视图(验证和绑定等)

时间:2017-05-09 13:44:42

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

考虑用户可以创建销售广告(帖子模型)。但每个广告都有不同的属性取决于其集团。属性不确定,可以由管理员添加不同的约束(必需.MinLength等)

我定义了一个这样的类:

public class Property
{
    public int Id { get; set; }

    public int Priority { get; set; }

    [Required()]
    public InputType Type { get; set; }

    [Required()]
    [MaxLength(150)]
    public string Title { get; set; }

    [Index(IsUnique=true)]
    [Required()]

    [MaxLength(100)]
    public string Values { get; set; }

    [MaxLength(100)]
    public string Description { get; set; }

    public ICollection<GroupProperty> GroupProperties { get; set; }

    public ICollection<PostProperty> PostProperties { get; set; }

}

例如,管理员可以将模型的汽车属性添加到汽车组。之后,用户必须填写模型车场,以便在汽车组中进行广告宣传。

创建广告视图是这样的:

@model IEnumerable<Property>

<section>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-6">
                <h1>New Advertising</h1>
                @using (Html.BeginForm())
                {
                    @Html.AntiForgeryToken()
                    foreach (var item in Model)
                    {
                        @Html.EditorFor(m => item)
                    }
                    <button type="submit">hvah</button>
                }

            </div>
            <div class="col-md-6">

            </div>
        </div>
    </div>
</section>

啊,一切都变得更难!我有一个Property类的Editor模板,如下所示:

@model Property


@helper Helper(Property model)
{
    switch (model.Type)
    {
        case WebSite.Models.DomainModels.InputType.NonNegative:
            {
                <div class="form-group">
                    <label for="@(model.Name)">@(model.Title)</label>
                    <span class="field-validation-valid  text-danger" data-valmsg-for="@(model.Name)" data-valmsg-replace="true"></span>
                    <input class="form-control  text-box single-line valid" data-val="true"
 name="@(model.Name)" type="number" value="0"/>
                </div>
                return;
            }

        case WebSite.Models.DomainModels.InputType.RequiredShortString:
            {
                <div class="form-group">
                    <label for="@(model.Name)">@(model.Title)</label>
                    <span class="field-validation-valid text-danger" data-valmsg-for="@(model.Name)" data-valmsg-replace="true"></span>
                    <input class="form-control text-box single-line" data-val="true"

                           id="@(model.Name)" name="@(model.Name)" type="text" value="BB"/>
                </div>

                return;
            }
    }
}

@Helper(Model)

毕竟我对属性进行了客户端验证。使用硬编码我也可以在服务器端验证它们。但新问题是绑定!如果服务器端验证出错,我需要传递一个模型再次查看。所以我认为我是以错误的方式做这件事。有人能帮我吗?也许关于如何解决我的问题或更好的方法来实现这个?一个简单的方法来使用MVC验证在这样的复杂模型上?

1 个答案:

答案 0 :(得分:0)

我认为你想要创建一个类并验证ModelState。你可以这样做 -

示例:

您可以像这样传递模型状态:

public class MyClass{
    public static void errorMessage(ModelStateDictionary ModelState) {
        if (something) ModelState.AddModelError("", "Error Message");
    }
}

在控制器中使用:

MyClass.errorMessage(ModelState);

如果您需要有关外部modaestate验证的更多信息,那么您可以通过this链接获得更多帮助。