【问题标题】:binding asp.net mvc form element to complex object for posting to controller将 asp.net mvc 表单元素绑定到复杂对象以发布到控制器
【发布时间】:2009-09-24 13:48:28
【问题描述】:

我正在尝试重构以避免从视图中解析 FormCollection,因此我将其更改为传入强类型对象。我的表单元素与 LinkUpdater 对象上的属性名称相同。但是当我在控制器的第一个链接上放置断点时,所有属性都为空。

有什么想法或建议吗?

查看:

 <%using (Ajax.BeginForm("AddNewLink", "Links", new AjaxOptions { UpdateTargetId = "LinkList", LoadingElementId = "updating", OnSuccess = "done" }))
  { %>

 <fieldset style="text-align:left">
 <table>
 <tr><td>Url:</td><td> <input style="width:500px" type="text" name="URL" /></td></tr>
 <tr><td>Description: </td><td><input style="width:400px" type="text" name="Description" /></td></tr>
 <tr><td>Tags: </td><td><input style="width:400px" id="Tags" name="tags" type="text" /></td></tr>
 <tr><td><input type="submit" value="Add Link" name="submit" /></td></tr>
 </table>
 </fieldset>
  <% } %>

控制器职位:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AddNewLink(LinkUpdater linkUpdater_)
    {
        string[] tags = linkUpdater_.Tags.Replace(" ", "").Split(',');
        linkRepository.AddLink(linkUpdater_.URL, linkUpdater_.Description, tags);
        .....
    }

LinkUpdater 类:

public class LinkUpdater
{
    public string URL;
    public string Description;
    public string Tags;
}

【问题讨论】:

  • 你能显示原始 POST(来自 Fiddler)吗?

标签: asp.net-mvc binding


【解决方案1】:

MVC 中的模型绑定器绑定到属性,而您使用字段。改为

public string URL { get; set; }

顺便说一句,还有其他缺点,比如如果你使用私有集,它也会默默地跳过绑定。

【讨论】:

    【解决方案2】:

    您没有使用强类型 HTMLHelpers 来呈现您的输入字段是否有任何特殊原因?

    <%using (Ajax.BeginForm("AddNewLink", "Links", new AjaxOptions { UpdateTargetId = "LinkList", LoadingElementId = "updating", OnSuccess = "done" }))
      { %>
    <fieldset style="text-align: left">
        <table>
            <tr>
                <td>
                    Url:
                </td>
                <td>
                    <%=Html.TextBox("URL", Model.URL, new { style = "width:500px;" }) %>
                </td>
            </tr>
            <tr>
                <td>
                    Description:
                </td>
                <td>
                    <%=Html.TextBox("Description", Model.Description, new { style = "width:400px;" }) %>
                </td>
            </tr>
            <tr>
                <td>
                    Tags:
                </td>
                <td>
                    <%=Html.TextBox("Tags", Model.Tags, new { style = "width:400px;" }) %>
                </td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="Add Link" name="submit" />
                </td>
            </tr>
        </table>
    </fieldset>
    <% } %>
    

    我不确定它是否能解决您的问题,但至少这是朝着正确方向迈出的一步。

    【讨论】:

    • 是的。 .这是因为我发回的数据不是我将完整视图绑定到的模型。 .也许这就是问题所在。 .完整页面视图绑定到更大的对象。这些必须是同一件事吗??
    • 这应该没什么区别,默认的 ModelBinder 不关心字段是如何创建的,只是名称和 id 与绑定对象中的属性匹配。尽管如此,HTMLHelpers 有助于保持代码更加灵活和类型安全。 Queen3 的解决方案对你有用吗?
    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多