2009-12-12 56 views
0

我正在使用MVC创建一些简单的CRUD页面。我有一个stringly类型的用户控制,我包括我的创建和编辑的观点,看起来像这样:MVC不在文本框中呈现模型属性

<% using (Html.BeginForm()) {%> 
<div class="form"> 
    <%:this.Model.Title%> 
    <p> 
     <label for="Title">Title:</label> 
     <%= Html.TextBox("Title", this.Model.Title) %> 
     <%= Html.ValidationMessage("Title", "*") %> 
    </p> 
    <p> 
     <label for="Summary">Summary:</label> 
     <%= Html.TextBox("Summary", this.Model.Summary)%> 
     <%= Html.ValidationMessage("Summary", "*") %> 
    </p> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</div> 
<% } %> 

..A创建行动,看起来像这样:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(string title, string summary) 
{ 
    Tour tour = this.TourManager.CreateTour(string.IsNullOrEmpty(title) ? DefaultText.TourTitle : title, string.IsNullOrEmpty(summary)? DefaultText.TourSummary : summary); 
    return this.View("Edit", tour); 
} 

...和编辑动作,看起来像这样:

public ActionResult Edit(int id) 
{ 
    Tour tour = this.TourManager.GetTour(id); 
    return this.View("Edit", tour); 
} 

我遇到的问题是,<%= Html.TextBox("Title", this.Model.Title) %>不渲染文本中的文本。 <%:this.Model.Title%>呈现良好,所以我知道模型已填充。只有从Create操作返回视图(URL为/ MyEntity/Create)时才会发生这种情况。当使用类似于/ MyEntity/Edit/1的URL调用Edit动作时,文本在文本框中呈现良好。这两个操作都将填充的模型传递给编辑视图,所以我不明白为什么会发生这种情况。

回答

3

我想建议你使用Post/Redirect/Get模式。帖子动作应该是:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(string title, string summary) 
{ 
    Tour tour = this.TourManager.CreateTour(string.IsNullOrEmpty(title) ? DefaultText.TourTitle : title, string.IsNullOrEmpty(summary)? DefaultText.TourSummary : summary); 
    return RedirectToAction("Edit", new { id = tour.id }); 
} 

您的问题是propably连接到人口密集的ModelState,这不是空的,因为你没有使用重定向。 MVC帮助程序使用来自填充模型状态的值,即使您在指定模型中使用它们。

+0

我之所以没有这样做的原因是因为我有一个单元测试,它声明Create动作将默认值放入模型中。 RedirectToRouteResult不包含模型,所以它使我很难测试。 – Charlie 2009-12-12 23:50:21

+0

这不是很好的理由。您应该在TourManager.CreateTour测试中检查这些默认值,而不是此操作测试。 – LukLed 2009-12-13 00:04:04

+0

这个答案是正确的。 ModelState问题是一个错误。无论是否通过设计,它都会让我失望。 =) – 2009-12-13 01:17:25