禁用的文本框在一个视图中发布,但在另一个视图中不发布

时间:2010-07-22 23:02:38

标签: asp.net-mvc

我有一个奇怪的问题,我有一个编辑视图,为slug呈现禁用的文本框,因此用户可以看到他正在编辑但不能更改它的内容的slug。只能在启用文本框的“创建”视图中更改slug。在编辑视图中,只能更改标题。

在编辑视图中,Slug文本框将从传入的ViewModel中填充,并且可以正常工作。

然而,当回发更改时,slug不会在编辑视图中发布一个内容类型(我相信,这是正确的行为),因此Model.IsValid(因为我附加了Required属性)对Slug属性)失败。如上所述,这很可能是正确的行为。

在编辑视图中,对于其他类型的内容,已发布已禁用文本框的内容且已发布的视图模型有效,我甚至可以看到Slug的值未更改。

我可以发布代码,但这些是相当大的视图,但是渲染Title和Slug文本框的相关代码部分对于创建/编辑视图和两种内容类型都是相同的,它是:

<div class="editor-label">
    <%= Html.LabelFor(model => model.Title, Resources.Localize.Section_Title)%>
</div>
<div class="editor-field">
    <%= Html.TextBoxFor(model => model.Title) %>
    <%= Html.ValidationMessageFor(model => model.Title) %>
</div>
<div class="editor-label">
    <%= Html.LabelFor(model => model.Slug, Resources.Localize.Section_Slug)%>
</div>
<div class="editor-field">
    <% if (string.IsNullOrWhiteSpace(Model.Slug))
 { %>
    <%= Html.TextBoxFor(model => model.Slug)%>
    <% }
 else
 { %>
    <%= Html.TextBoxFor(model => model.Slug, new { disabled = true })%>
    <% } %>
    <%= Html.ValidationMessageFor(model => model.Slug) %>
</div>

我正在为创建和编辑使用一个局部视图,这就是 if ... else ... 语句的原因,因为我们只在编辑时禁用Slug文本框。

希望有人对此有所了解,因为我无法弄明白。

更新:

最奇怪的事情。这些行

<form id="Page-CreateEditForm" action="<%=Url.Action(Url.RequestContext.RouteData.GetRequiredString("action"), Url.RequestContext.RouteData.GetRequiredString("controller")) %>" enctype="multipart/form-data" method="post">

<form id="Section-CreateEditForm" action="<%=Url.Action(Url.RequestContext.RouteData.GetRequiredString("action"), Url.RequestContext.RouteData.GetRequiredString("controller")) %>" enctype="multipart/form-data" method="post">

在我的视图中(两者都相同)生成这些:

编辑页面“测试页面”时的表单开始标记。 Slug:测试页面。注意动作中的slu!!

<form id="Page-CreateEditForm" action="/Page/Edit/test-page" enctype="multipart/form-data" method="post">

编辑“测试部分”部分时的表格开始标记。 Slug:测试部分。请注意编辑后如何丢失slu。

<form id="Section-CreateEditForm" action="/Section/Edit" enctype="multipart/form-data" method="post">

现在问题变成为什么相同的表单标记定义会在运行时导致两个不同的操作?

关注:

当然,经过深思熟虑之后,这必须源于global.asax.cs中的路由定义,所以让我们在那里查看。这就是我们发现的:

        routes.MapRoute(Localize.Routes_PagesEdit, RouteType.Admin, "Page/Edit/{slug}",
                        new {controller = "Page", action = "Edit", slug = ""}, null);

        routes.MapRoute(
            Localize.Routes_SectionsEdit,
            RouteType.Regular,
            "Section/Edit",
            new {controller = "Section", action = "Edit"}, null
            );

查看Section Edit路径缺失{slug}参数的方式。我相信我已经接近解决方案。

1 个答案:

答案 0 :(得分:0)