如何为父对象属性设置默认绑定属性?

时间:2011-12-08 16:41:39

标签: c# asp.net-mvc-3 c#-4.0 attributes razor

我遇到了很多看似这样的事情:

public class TestClass
{
    public string Property1 {get;set;}
    public string Property2 {get;set;}
    public AddressType Type {get;set;}
    [RequiredIf("", "", ErrorMessage="...")]
    public int TypeId
    {
        get
        {
            if (Type == null)
                return 0;
            else
                return Type.Id;
        }
        set
        {
            Type = new AddressType() { Id = value };
        }
    }
}

public class AddressType
{
    public int Id {get;set;}
    public string Description {get;set;}
}

这样我就可以模拟以剃刀形式绑定信息并来回绑定。我想知道是否有任何人知道在哪里可以对“AddressType”应用属性来设置类的默认绑定属性,或者将属性放在TestClass的“Type”字段中并说“When你绑定,真的绑定到Type.Id,但验证整个对象,否则......

不确定我是否正确地问这个问题,但是如果可能的话我只想要一个更清晰的实现......我觉得在课堂上添加TypeId是不必要的,这使得它很难阅读。

Thx Guys!

1 个答案:

答案 0 :(得分:0)

好的,我不是100%对你在这里提出的问题,但我会假设AddressType可以为空而试一试。

public class TestClass
{
    public AddressType? Type {get;set;}
    public int TypeId
    {
        get
        {
            return Type.HasValue ? Type.Value.Id : 0;
        }
    }
}

查看AddressType虽然我猜测它的查找类型来自某种数据存储区。我使用T4模板生成这些类型的查找列表(不会在版本之间更改值)作为我的应用程序中的枚举。如果你这样做会减轻你的压力。

现在,如果您想要的是剃须刀视图中的AddressType值下拉列表,您将不得不在控制器中做一些大的工作(不太感激)

public class BetterTestClass
{
    public AddressType? Type {get;set;}
}

...在你的AddressController中

public ActionResult Create(){

    // the name in the ViewBag should match 
    // the property you want to have a list on 
    ViewBag.Type = repository
                   .AddressTypes
                   .ToList()
                   .Select(p => new SelectListItem { 
                                    Key = p.Id, 
                                    Value = p.Description});

    ViewData.Model = new BetterTestClass();
    return View();
}

如果你搜索@ Html.DropDownList

,有很多例子

修改

通过你的问题弄清楚你想要实现的目标真的很难。但我会尽力帮助。首先我要正确理解你的问题:

  • TestClass与AddressType
  • 的关系为0..1
  • 地址类型具有Id,因为它是实体类
  • 出于某种原因,您希望在设置AddressType时通过UI设置AddressType的Id。 (我在回答中概述了推断是你不需要必需的属性)