在另一个类中填充对象

时间:2017-08-08 10:42:01

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

我有一个搜索对象:

public class Search
    {

    [Display(Name = "First name:")]
    [DataType(DataType.Text)]
    public string fname { get; set; }

    [Display(Name = "Surname:")]
    [DataType(DataType.Text)]
    public string sname { get; set; }

    [Display(Name = "Date to (dob):")]
    [DataType(DataType.Date)]
    public DateTime? dateT { get; set; }

    [Display(Name = "Date from (dob):")]
    [DataType(DataType.Date)]
    public DateTime? dateF { get; set; }

    public Search()
    {
        /*
        first_name = string.Empty;
        surname = string.Empty;
        dateT = null;
        dateF = null;
        */            
    }
}

我在下面的课程中实例化了这个:

public class MainModel
{

    public UserML userLM;

    public Search search;

    public MainModel()
    {
        userLM = new UserML();
        search = new Search();           
    }

}

主模型是我使用我的视图填充搜索对象但我在提交时保持空值(在我的控制器中放置断点)

示例字段:

@Html.LabelFor(model => model.search.fname)
@Html.EditorFor(model => model.search.fname, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.search.fname, "", new { @class = "text-danger" })

传递给视图的模型:

WebApp1.MainModel

这可能吗?任何想法?

另见:

create-an-object-inside-another-class-c

2 个答案:

答案 0 :(得分:2)

您已在模型中创建了字段,而不是MainModel类中的属性,您需要将它们公开为属性通过提供getset,以便MVB的ModelBinder可以突变这些:

public class MainModel
{
    public UserML userLM {get;set;}  // note { get;set; }

    public Search search {get;set;}

     public MainModel()
     {
        userLM = new UserML();
        search = new Search();           
    }

}

现在可以让Model Binder正确地将值绑定到表单帖子上,模型绑定实际上不会对Fields有效。

答案 1 :(得分:0)

字符串的默认值为null。你需要明确说明你是否希望它们在你的主模型的构造函数中是空字符串,如下所示:

 public MainModel()
 {
    userLM = new UserML();
    search = new Search{
        fname = "", 
        //other properties           
 }

或者在搜索对象本身的构造函数中执行此操作。

或者您可以在Search类中使用字段初始值设定项,如下所示:

[Display(Name = "First name:")]
[DataType(DataType.Text)]
public string fname { get; set; } = ""

对于返回绑定,Main模型上的字段必须是属性。您可以通过在每个字段的末尾添加{get; set;}来实现此目的。