2010-04-29 121 views
5

丟失後我有兩個簡單的方法的控制器:Asp.Net MVC EditorTemplate模型後

UserController的方法:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Details(string id) 
{ 
User user = UserRepo.UserByID(id); 

return View(user); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Details(User user) 
{ 
return View(user); 
} 

然後是用於顯示細節一個簡單的觀點:

<% using (Html.BeginForm("Details", "User", FormMethod.Post)) 
    {%> 
<fieldset> 
    <legend>Userinfo</legend> 
    <%= Html.EditorFor(m => m.Name, "LabelTextBoxValidation")%> 
    <%= Html.EditorFor(m => m.Email, "LabelTextBoxValidation")%> 
    <%= Html.EditorFor(m => m.Telephone, "LabelTextBoxValidation")%> 
</fieldset> 
<input type="submit" id="btnChange" value="Change" /> 
<% } %> 

正如你所看到的,我使用編輯器模板 「LabelTextBoxValidation」:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %> 
<%= Html.Label("") %> 
<%= Html.TextBox(Model,Model)%> 
<%= Html.ValidationMessage("")%> 

顯示用戶信息不成問題。該視圖呈現完美的用戶細節。 當我提交表單時,對象用戶會丟失。我在行「return View(User);」上進行調試在Post Details方法中,用戶對象填充了可爲空的值。如果我不使用編輯器模板,用戶對象將填充正確的數據。所以編輯器模板一定有問題,但不知道它是什麼。建議?

+0

比較使用螢火蟲或提琴手兩種情況下,提交的表單。它會有所不同。修復。 – 2010-04-29 13:06:02

回答

1

我會重新設計一點 - 將LabelTextBoxValidation編輯器更改爲Html幫助器,然後爲您的數據模型創建一個EditorTemplate。這樣,你可以做這樣的事情:

<% using (Html.BeginForm("Details", "User", FormMethod.Post)) 
{%> 
    <fieldset> 
    <legend>Userinfo</legend> 
    <% Html.EditorFor(m => m); %> 
    </fieldset> 
    <input type="submit" id="btnChange" value="Change" /> 
<% } %> 

而且你的編輯模板將是這樣的:

<%= Html.ValidatedTextBoxFor(m => m.Name); %> 
<%= Html.ValidatedTextBoxFor(m => m.Email); %> 
<%= Html.ValidatedTextBoxFor(m => m.Telephone); %> 

其中ValidatedTextBoxFor是您的新的HTML幫手。爲了實現這個,這將是相當容易:

public static MvcHtmlString ValidatedTextBoxFor<T>(this HtmlHelper helper, Expression thingy) 
{ 
    // Some pseudo code, Visual Studio isn't in front of me right now 
    return helper.LabelFor(thingy) + helper.TextBoxFor(thingy) + helper.ValidationMessageFor(thingy); 
} 

這應該設置窗體字段的名稱權,我相信,因爲這似乎是問題的根源。

編輯:這裏是代碼應該幫助你:

public static MvcHtmlString ValidatedTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{ 
    return MvcHtmlString.Create(
      html.LabelFor(expression).ToString() + 
      html.TextBoxFor(expression).ToString() + 
      html.ValidationMessageFor(expression).ToString() 
      ); 
} 
+0

行Html.EditorFor(m => m)呈現模型的所有成員,這不是我想要的。我只想渲染用戶類的三個成員。但新的HTML幫手看起來不錯,謝謝! :) – Colin 2010-04-29 13:32:00

+0

如果您在\ Views \ \ EditorTemplates \ – Tejs 2010-04-29 13:41:22

+0

中定義您自己的EditorTemplate,那麼請不要使用Tejs:要做到這一點,這將非常簡單:您可以更清楚地瞭解如何創建此類HtmlHelper?我正在嘗試創建一個具有這種結構的結構,但我沒有這樣做。 – Colin 2010-05-03 14:22:59