структура c # mvc - простой вопрос - PullRequest
0 голосов
/ 04 июня 2011

Мне нужна информация здесь. Я новичок в MVC, поэтому для вас, ребята, я думаю, что на этот вопрос будет легко ответить. У меня есть следующая структура:

Controller.cs

Public ActionResult PageMain() {
     return View(); // this is the main page I'm working with
}

[ChildActionOnly]
Public PartialViewResult Partial1(string tablename) {
      //Some code to construct datatable according to the url parameter
      return PartialView("Partial1", DataTable);
}

Public ActionResult FormAction(string tablename, FormCollection formvalues) {
      //Here I send the values to the model in which I have a public void
      //that updates the database -> I'm not using Linq at this phase because 
      //both the tables and fields are dynamic
      //I execute the code in a try and catch statement

      try 
      {
          //some code
          Response.Redirect("url to PageMain");
      } 
      catch (Exception ex) {
          ModelState.AddModelError("Error", ex);
          Return View("PageMain", ex); 
          // actually, here I'd like to send the exception error
          // to the partialview which renders the error as its model but 
          // but I don't know how since if I use return PartialView() 
          // then only the partial view will be displayed, not the whole page
      }
}

Наконец, в представлении PageMain у меня есть:

//Some initial code with the form that posts value to FormAction
@Html.RenderPartial("Partial1") //this is the partial which shows error 
                                //it is only displayed when the form is posted
                                //and there is an error

Хорошо, теперь мои вопросы: допустима ли такая структура (здесь под действительной я подразумеваю, хорошо ли она структурирована или есть лучший способ)? и как я могу достичь исключения в методе ModelState.AddModelError() в частичном представлении 'Partial1'?

Если вы не уверены, подведите итог:

  • В PageMain есть таблица, построенная в соответствии с параметром url. На самом деле, он построен в другом частичном представлении, но отображается в PageMain
  • Когда я редактирую таблицу, форма перенаправляет меня в FormAction, где выполняются коды редактировать базу данных
  • Наконец, если есть ошибка, пользователь остается в FormAction, но на этой странице используемое представление по-прежнему PageMain, у меня нет другого представления для этой страницы, так как это было бы похоже на создание одной и той же страницы дважды. Я имею в виду только включить частичное представление, которое показывает ошибки, которые я не хотел создавать другое представление. Вместо этого я пытаюсь сделать видимым частичное представление с некоторой логикой if - else только в случае некоторых ошибок

1 Ответ

1 голос
/ 05 июня 2011

Несколько вещей, которые я бы изменил здесь

Во-первых, здесь:

 Response.Redirect("url to PageMain");      

Вы хотите вместо этого вернуть

RedirectToAction("PageMain") 

секунду - сделать Pagemain действительным толькодля получения запросов с использованием атрибута HttpGet.

[HttpGet]
public actionResult PageMain() 
{     
   return View(); 
// this is the main page I'm working with
}

Третье - сделать это HttpPost

[HttpPost]
Public ActionResult FormAction(string tablename, FormCollection formvalues) 

Четвертое - обычно вы увидите, что люди имеют метод GET и метод POST имеют одно и то же имяи один помечен как HttpGet, а другой - как HttpPost, принимающий, конечно, разные типы параметров.

Пятый - я бы порекомендовал вам ваше представление - строго типизированное представление, не основанное на DataTable, а ваш собственный класс - скажем, с именем «Клиент»в верхней части вашего представления вы знаете, что он строго типизирован, когда вы видите что-то вроде (для списка клиентов)

@model IEnumerable<Customer>

Когда вы делаете это, ваш метод FormAction может автоматически принимать объект типа Customer -Model Binder в MVC автоматически сопоставляет значения формы с именами в этом объекте и устанавливает значения свойств.Это одна из замечательных возможностей MVC.Таким образом, ваш метод стал бы:

Public ActionResult FormAction(Customer customer) 

, и теперь у вас есть объект клиента, с которым нужно иметь дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...