c# - 即使属性已设置且有效,为什么 TryUpdateModel 仍返回 false?

标签 c# asp.net asp.net-mvc-3 entity-framework data-annotations

我有基于 ASP.Net MVC3 的 Web 应用程序。我需要一个“创建” View ,在用户从下拉列表中选择要创建的子类型之前,该 View 不会知道模型类型。为了尝试解决此问题,我在 Shared/EditorTemplates 下为每个派生模型类型创建了一个编辑器模板。这允许我创建一个对 View 模型强类型的“Create.cs”。 View 模型只有两个成员,一个枚举和一个复杂类型。这个想法是, View 最初仅显示一个下拉列表(枚举成员的编辑器),然后当用户最初提交指定的“模型类型”(下拉选择的值)时,POST 操作可以检查“模型类型” "为 View 模型的单个复杂成员指定并实例化正确的派生模型类型,该成员的类型是所有可能的“模型类型”的基本类型。

抽象+派生类型模型对象...

public abstract class MyModelBase
{
    public MyModelType_e ModelType {get; set; }
    [Required]
    public string Name { get; set; }
}

public class DerivedType1 : MyModelBase
{ ... }

public class DerivedType2 : MyModelBase
{ ... }

public class DerivedType3 : MyModelBase
{ ... }

我有一个复杂的 View 模型,如下......

public enum MyModelType_e
{
    DerivedType1 = 0,
    DerivedType2 = 1,
    DerivedType3 = 2
}

public class MyModelCreate
{
    public MyModelType_e ModelTypeForSelectList { get; set; }
    public MyModelBase ModelBase { get; set; }
}

我的 GET Controller 操作实例化了 View 的上述 View 模型,即,仅显示一个下拉列表,其中包含基于 MyModelType_e 枚举的项目 + 模型的“ModelBase”属性的值最初为 null。所以 GET 操作方法看起来像这样......

[HttpGet]
public ActionResult Create()
{
    return View(new MyModelCreate());
}

请注意下面关于我的问题的关键的大写注释,即 TryUpdateModel 失败(见下文),即使它按预期将 ModelBase(派生类型)成员的属性设置为相应的表单值...

[HttpPost]
public ActionResult Create(MyModelCreate model)
{
    if (model.ModelBase == null || 
        (int)model.ModelTypeForSelectList != model.ModelBase.ModelType)
    {
        switch (model.ModelType)
        {
            case MyModelType_e.DerivedType1:
                model.ModelBase = new DerivedType1();
                break;
            case MyModelType_e.DerivedType2:
                model.ModelBase = new DerivedType2();
                break;
            case MyModelType_e.DerivedType3:
                model.ModelBase = new DerivedType3();
                break;
        }
        return View(model);
    }

    if (!TryUpdateModel(model.ModelBase))
        return View(model); // <<< THIS HAPPENS EVEN THOUGH ModelBase APPEARS TO BE UPDATED PROPERLY... 
    // For instance, I can see right here with intellisense that model.ModelBase.Name
    // is NOT null or empty but rather is truly updated with the correct form value(s)...

    // TODO: Insert the record, etc... (currently we never get here...)
}

所以上面的部分是问题的根源,但这是我的观点来帮助理解......

 @model MyNamespace.MyModelCreate

 <h2>Create</h2>

 ...

 @using (Html.BeginForm())
 {
     @Html.ValidationSummary(false)
    <fieldset>
    <legend>Input</legend>
    <div class="editor-label">
    @Html.Label("Select Model Type")
    </div>
    <div>
    @Html.EnumDropDownListFor(model => model.ModelType)
    @Html.ValidationMessageFor(model => model.ModelType)
    </div>

    @* 
    Conditionally show the correct editor template... 
    There is one existing under ../Shared/EditorTemplates for each
    derived type (DerivedType1, DerivedType2, DerivedType3, etc...)
    This much is working in the sense that the correct editor fields
    are displayed based on what the user selects in the above drop-down.
    *@
    @if (Model.InputModel != null)
    {  
        @Html.EditorFor(model => model.ModelBase);
    }

    <p>
        <input type="submit" value="Continue" />
    </p>              
    </fieldset>
}

因此,一旦进行初始 POST(选择模型类型),我的 POST 操作方法就会按设计落入 TryUpdateModel 行,但由于某种原因验证失败。我真正不明白的部分是,验证摘要报告“需要名称”,即使我可以清楚地看到 TryUpdateModel 在 View 模型的 ModelBase 成员上正确设置了名称属性。

我非常感谢这里的任何帮助或指导...我对 ASP.NET MVC 相当陌生,并且我愿意以不同的方式做事,因为我知道可能还有其他方法可以设计我的请求/操作 + View 来完成这个“多步骤”问题,但我实际上只是追求最简单的可能的事情,这就是为什么我喜欢使用 EditorTemplate 方法来处理派生模型类型等。

提前致谢...

最佳答案

检查模型状态TryUpdateModel 运行后应该会设置错误。 我必须从某些属性中删除 Required 属性。

关于c# - 即使属性已设置且有效,为什么 TryUpdateModel 仍返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264610/

相关文章:

c# - 如何计算滚动条拇指的大小?

c# - 开头带有一些无效数据的 TripleDes 解密

c# - POST 表单数组没有成功

c# - 具有内部类对象的抽象类构造函数继承

asp.net - web.config 或 app.config 是否缓存在内存中

validation - ASP.NET MVC 3.0 部分内部和外部具有不显眼的数据验证属性问题的表单

asp.net - 重定向到发布方法/操作

asp.net - 是否可以检测页面刷新(F5)服务器端?

jquery - MVC 3 客户端对带有数据注释的集合进行验证 - 不起作用

asp.net mvc 和 sql 查询