2010-05-19 5 views
4

Я создаю веб-приложение для обмена сообщениями в ASP.NET и испытываю некоторые проблемы при отображении пользователю сообщения об ошибке, если они отправляются на отправку сообщения, и есть что-то неправильно.ASP.NET MVC: Возвращение представления с неповрежденным querystring

Пользователь может просматривать профили пользователей, а затем нажать «отправить сообщение». Следующее действие называется (Ссылка/сообщение/сотвори = имя пользователя?) И показывает их на страницу, где они могут войти в их сообщение и отправить его:

public ActionResult Create(string to) 
{ 
    ViewData["recipientUsername"] = to; 

    return View(); 
} 

На странице, которая отображается, имя пользователя вводится в скрытое поле ввода. Когда пользователь нажимает кнопку «отправить»:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection collection, string message) 
{ 
    try 
    { 
     //do message stuff that errors out 
    } 
    catch 
    { 
     ModelState.AddModelErrors(message.GetRuleViolations()); //adding errors to modelstate 
    } 

    return View(); 
} 

Так что теперь сообщение об ошибке отображается в пользовательском штрафа, однако URL изменяется в том, что он больше не имеет строки запроса (/ сообщение/создать). Опять же, это было бы хорошо, за исключением того, что когда пользователь нажимает кнопку обновления, ошибки страницы в качестве действия «Создать» больше не имеют параметра «to».

Так что я предполагаю, что мне нужно как-то поддерживать мой запрос. Есть ли способ сделать это или мне нужно вообще использовать другой метод?

+1

Поскольку метод Create принимает строку '' to', то при возврате View 'to' все еще будет задано значение в Url (querystring или где бы вы ни устанавливали правила маршрутизации). Вы говорите, что как только вы вызываете 'return View()' Url больше не содержит "to" в querystring? –

+0

Хмм ... Я думаю, вы, возможно, просто ответили на мой вопрос. Чтобы упростить мое действие выше, я просто добавил его как параметр к сообщению Создать действие. Обновился, чтобы показать фактический код. Я получаю получателя по коллекции ['recipientUsername']. Если я изменю это на параметр действия create, будет ли он исправлен? Если да, напишите ответ, и я помету его. (также, да - url больше не содержит 'to' в querystring) – ajbeaven

ответ

3

Я предполагаю, что вы делаете что-то вроде ...

<% Html.BeginForm("Create", "Controller") { %> 

<% } %> 

Как вы создаете URL действия формы пути маршрутизации, существующие значения маршрутов будут потеряны в процессе. Самый простой способ избежать этого - просто использовать безпараметрическую версию BeginForm, так как вы находитесь на странице, на которую вы отправляете сообщения.

<% Html.BeginForm() { %> 

<% } %> 

Это будет использовать текущий URL-адрес, строку запроса и все, как ДЕЙСТВИЕ формы. В противном случае вам необходимо будет передать значение маршрута to в перегрузке BeginForm.

+0

Легенда, это было именно то, что я сделал. Спасибо, кучи. – ajbeaven

1

Порекомендуйте вам ознакомиться с шаблоном PRG, который поможет в этом.

http://devlicio.us/blogs/tim_barcz/archive/2008/08/22/prg-pattern-in-the-asp-net-mvc-framework.aspx

+1

Я вижу, что он говорит, чтобы добавлять сообщения об ошибках в TempData вместо ModelState. Я не думал, что это соответствует предлагаемой ошибкой asp.net mvc. – ajbeaven