0

在 ASP.NET MVC 应用程序中,我有一个模型定义如下:

public class TestModel
{
    private string _firstName;

    [DisplayName("First Name")]
    [StringLength(20)]
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (!string.IsNullOrEmpty(value))
                if (value.Length > 20)
                    throw new Exception("Too long");

            _firstName = value;
        }
    }
}

在我的控制器更新操作方法中,我有以下代码:

[HttpPost]
public ActionResult Update()
{
    var tm = new TestModel();
    if (ModelState.IsValid)
    {
        if (TryUpdateModel(tm))
        {
            // Save to the DB
        }
    }

    return View("Test", tm);
}

问题是,当我在视图中的文本框中输入一个超过 20 个字符的值时,我希望 MVC 不会尝试在我的模型上设置属性(然后抛出异常,因为它太长而无法放入数据库列)。在实际尝试设置属性之前,我会认为它会被 ModelState.IsValid 测试停止。

请注意,我在这里模拟一个实际的 ORM - LLBLGenPro - 这是它为具有长度的数据库列生成的属性所做的 - 如果您尝试设置一个太长的值,它会引发异常。

除了修改 LLBLGen 的模板,我应该如何解决这个问题?

这是 ASP.NET MVC 的正常行为吗?

4

1 回答 1

0

您提供的代码没有从视图接收模型实例,并且您正在您的代码中创建类的实例,因此无法告诉
此代码:

var tm = new TestModel();   

创建 Testmodel 的实例,但无论如何它都没有绑定到从发布的表单接收到的值。你的动作应该基本上看起来像

public ActionResult Update(TestModel model) 

这是模型 mvc 将尝试验证的实例。
也许您应该发布您的整个代码(包括视图)以查看是否缺少其他任何内容,但是使用您到目前为止提供的代码,您将永远不会在存储库中更新表单值,也不会抛出异常,因为FirstName 将保持为空。

于 2012-06-12T11:53:40.873 回答