MVC如何向局部视图传递多个参数?

4
我希望能够向部分视图传递多个参数。以下是相关代码:

 <% Html.RenderPartial("Details", Model.test, new ViewDataDictionary { { "labelName", "Values1" }, {"header", "Header1"}, {"header2", "Header2"}}); %> 

代码出现错误信息:

缺少)。

出了什么问题?


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<MvcUI.Models.Label>>" %>

 <%var label = ViewData["labelName"];%>
 <%int count = 0; %>


            <%if (Model!=null) {%>           
               <% foreach (var model in Model){ %>     


                    <%if (!String.IsNullOrEmpty(model.Name))                   
                   {%>
                    <li>
                          <%: Html.Hidden((label)+".Index", count.ToString())%>
                          <%: Html.TextBox((label)+"[" + (count) + "].Name", model.Name, new { Style = "width:280px" })%>
                          <%: Html.Hidden((label)+"[" + (count++) + "].ID", model.ID, new { Style = "width:280px" })%>
                        <input type="button" value = "Delete"/>
                    </li>
                    <%}
                     %>
                 <%} %>

                <% } %> 

那行代码对我来说运行良好。 - sipsorcery
1个回答

6

不必使用 ViewDataDictionary,您可以直接将所需的值添加到模型中:

public class MyModel
{
    public string Test { get; set; }
    public string LabelName { get; set; }
    public string Header { get; set; }
    public string Header2 { get; set; }
}

然后简单地执行:

<% Html.RenderPartial("Details", Model); %> 

除此之外,您的语法没有问题。您遇到的错误来自其他地方:

<% Html.RenderPartial(
    "Details", 
    Model.test, 
    new ViewDataDictionary { 
        { "labelName", "Values1" }, 
        { "header", "Header1" }, 
        { "header2", "Header2" }
    }
); %>

更新:

既然您已经展示了您的代码,让我建议您使用编辑器模板来进行更加清晰的处理。

首先定义一个模型:

public class MyModel
{
    public IEnumerable<Label> Labels { get; set; }
}

public class Label
{
    public string ID { get; set; }
    public string Name { get; set; }
}

接下来需要一个控制器来填充这个模型:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyModel
        {
            Labels = new[] 
            {
                new Label { ID = "l1", Name = "Label 1" },
                new Label { ID = "l2", Name = "Label 2" },
                new Label { ID = "l3", Name = "Label 3" }
            }
        };
        return View(model);
    }
}

然后是视图(~/Views/Home/Index.aspx):
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.MyModel>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <ul>
        <%: Html.EditorFor(x => x.Labels) %>
    </ul>
</asp:Content>

最后是编辑器模板 (~/Views/Home/EditorTemplates/Label.ascx):


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Models.Label>" %>
<li>
    <%: Html.HiddenFor(x => x.ID) %>
    <%: Html.TextBoxFor(x => x.Name) %>
    <input type="button" value="Delete" />
</li>

正如您所看到的,使用编辑器模板,您无需再担心命名输入、维护和递增索引、编写循环等容易出错的事情,这些事情都由框架自动处理。


1
@user281180,错误出现在 Details.ascx 的第5行,而不是你包含Partial的方式。你在这一行上写了什么? - Darin Dimitrov
还不错。在我的电脑上运行良好。一定有其他你没有展示的东西。 - Darin Dimitrov
你从index.aspx页面中的哪里调用Label.ascx? - learning
好的,太棒了!非常感谢! 但是如果我有以下代码: var model = new MyModel { Labels = new[]
{ ... } Labels2 = new[]
{ ... } Labels3 = new[]
{ ... } }; return View(model);
- learning
我这样做是因为我有多个标签实例。 - learning
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接