结合到一个对象的属性和列表 [英] Binding to an object with properties and a list

查看:86
本文介绍了结合到一个对象的属性和列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经能够正确地绑定对象的列表。工作正常。现在,当我更改的项目一个复杂的对象将停止工作。

的复杂对象是房间名称与对象的列表。当回传的名义返回罚款,但对象列表回来为空。

任何提示吗?

房型号:

 公共类房
{
    公共字符串名称{;组; }
    公开名单<期权及GT;选项​​{搞定;组; }    公众间(){}
    公众间(字符串名称,列表与LT;选项>选项)
    {
        名称=名称;选项​​=选择;
    }
}

期权定价模型

 公共类选项
{
    公共BOOL IsSelected {搞定;组; }
    公共字符串的ImagePath {搞定;组; }
    公众诠释的UniqueID {搞定;组; }    公共选择(){}
    公共选择(布尔isSelected,字符串的ImagePath,诠释UNIQUEID)
    {IsSelected = isSelected;的ImagePath =的ImagePath;的UniqueID = UNIQUEID; }
}

HomeController的

 公众的ActionResult指数()
    {
        清单<期权及GT;选项​​=新的List<期权及GT;();        options.Add(新选件(真的,../Content/cars_2.jpg,4));
        options.Add(新选件(真的,../Content/vw_one_liter_concept01_2.jpg,6));
        options.Add(新选件(假的,../Content/00018578.jpg,8));
        //获取所选选项列表,并与工会的所有剩余        房间模型=新房间(室1,选项);        返回查看(模型);
    }
    [HttpPost]
    公众的ActionResult指数(室模型)
    {
        计算机[成果] = model.Options.Count();
        返回查看(模型);
    }

索引视图

 <%@页面语言=C#继承=System.Web.Mvc.ViewPage< MultiSelect.Models.Room>中%GT;!< D​​OCTYPE HTML PUBLIC -  // W3C // DTD XHTML 1.0过渡// ENhttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">< HTML的xmlns =htt​​p://www.w3.org/1999/xhtml>
<头=服务器>
    <标题>指数< /标题>
    <脚本SRC =../../脚本/ jQuery的-1.4.1.js类型=文/ JavaScript的>< / SCRIPT>
    <脚本SRC =../../脚本/ jQuery的-UI-1.8.10.custom.min.js类型=文/ JavaScript的>< / SCRIPT>
< /头>
<身体GT;<使用%(Html.BeginForm())
   {%GT;
    <%= Html.ValidationSummary(真)%GT;
    &所述;%= Html.TextBoxFor(M => m.Name)%GT;
    <%Html.RenderPartial(多选,Model.Options); %GT;<%}%GT;
< /身体GT;
< / HTML>

多选局部视图

 <%@控制语言=C#继承=System.Web.Mvc.ViewUserControl<&IList的LT; MultiSelect.Models.Option>>中%GT;
<%的for(int柜台= 0;反< Model.Count();反++)
   {%GT;
    < D​​IV CLASS =选择>
        <%= Html.HiddenFor(I = I标记[计数器] .UniqueID)%GT;
        <%= Html.HiddenFor(I = I标记[计数器] .ImagePath)%GT;
        <%= Html.CheckBoxFor(I = I标记[计数器] .IsSelected)%GT;
        &所述; IMG SRC =&下;%= Model.ElementAt(计数器).ImagePath%gt;中ALT =图像WIDTH =128HEIGHT =128/>
    < / DIV>
<%}%GT;
<输入ID =Submit1类型=提交值=提交/>


解决方案

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/提供你正在寻找一个解决方案。

另外,一个更简单,但不灵活的解决方案是把一个Room.cshtml文件,并在您的共享/ EditorTemplates文件夹中的文件Option.cshtml。然后你就会把

 <%= Html.TextBoxFor(M = GT; m.Name)%GT;
&所述;%Html.EditorFor(M => m.Options); %GT;

在Room.cshtml

 <%Html.EditorFor(M = GT;产品型号); %GT;

在指数,和在Option.cshtml的局部视图中的内容。

I've been able to bind a list of objects correctly. Works fine. Now when I change the item a complex object it stops working.

The complex object is the room name with the list of objects. When the 'postback' the name returns fine, but the list of objects comes back as null.

Any hints please?

Room Model:

    public class Room
{
    public string Name { get; set; }
    public List<Option> Options { get; set; }

    public Room() { }
    public Room(string name, List<Option> options)
    {
        Name = name; Options = options;
    }
}

Options Model

public class Option
{
    public bool IsSelected { get; set; }
    public string ImagePath { get; set; }
    public int UniqueID { get; set; }

    public Option() { }
    public Option(bool isSelected, string imagePath, int uniqueID)
    { IsSelected = isSelected; ImagePath = imagePath; UniqueID = uniqueID; }
}

HomeController

    public ActionResult Index()
    {
        List<Option> options = new List<Option>();

        options.Add(new Option(true, "../Content/cars_2.jpg", 4));
        options.Add(new Option(true, "../Content/vw_one_liter_concept01_2.jpg", 6));
        options.Add(new Option(false, "../Content/00018578.jpg", 8));
        //Get a list of selected options and union with all remaining

        Room model = new Room("Room1", options);

        return View(model);
    }
    [HttpPost]
    public ActionResult Index(Room model)
    {
        ViewData["results"] = model.Options.Count();
        return View(model);
    }

Index View

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MultiSelect.Models.Room>" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
    <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery-ui-1.8.10.custom.min.js" type="text/javascript"></script>


</head>
<body>

<% using (Html.BeginForm())
   {%>
    <%= Html.ValidationSummary(true)%>
    <%= Html.TextBoxFor(m=> m.Name) %>
    <% Html.RenderPartial("MultiSelect", Model.Options); %>

<% } %>
</body>
</html>

MultiSelect Partial View

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<MultiSelect.Models.Option>>" %>
<% for (int counter = 0;counter< Model.Count(); counter ++)
   { %>
    <div class="opt">
        <%= Html.HiddenFor(i=> i[counter].UniqueID)%>
        <%= Html.HiddenFor(i=> i[counter].ImagePath) %>
        <%= Html.CheckBoxFor(i => i[counter].IsSelected)%>
        <img src="<%= Model.ElementAt(counter).ImagePath %>" alt="Image" width="128" height="128" />
    </div>
<% } %>
<input id="Submit1" type="submit" value="submit" />

解决方案

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ provides a solution for what you're looking for.

Alternatively, an easier, but less flexible solution is to put a Room.cshtml file, and a Option.cshtml file in your Shared/EditorTemplates folder. Then you'd put

<%= Html.TextBoxFor(m=> m.Name) %>
<% Html.EditorFor(m => m.Options); %>

in Room.cshtml

<% Html.EditorFor(m => Model); %>

in index, and the contents of your partial view in Option.cshtml.

这篇关于结合到一个对象的属性和列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆