Страница контактов с ASP.NET MVC 3 - PullRequest
2 голосов
/ 07 мая 2011

У меня есть страница контактов, и на этой странице должна быть либо форма, либо сообщение об успешном завершении, либо сообщение об ошибке, поэтому в основном это выглядит примерно так:

@model MyApp.Models.ContactData

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div>

...Some static content...


If page was opened the first time
    -> Render a form here
Else If form was posted and data successfully processed
    -> Render a success message here
Else If form was posted but error occurred during processing
    -> Render a failure message here

...Some static content...


</div>

Я не знаю, как лучше всегодобиться этого с помощью MVC 3. Создаю ли я три совершенно отдельных представления (чего я бы хотел избежать из-за статического содержимого, которое было бы одинаковым для всех трех представлений)?Или я мог бы создать три частичных представления и затем решить, основываясь на дополнительном флаге, который я мог бы поместить в класс модели, какой частичный вид будет отображаться?Или я могу как-то динамически внедрить частичные представления из контроллера в представление?

Контроллер, который у меня есть, выглядит так:

public class ContactController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(ContactData contactData)
    {
        if (ModelState.IsValid)
        {
            ContactService service = new ContactService();
            bool result = service.Process(contactData);

            return ?; // What do I return now? It must somehow depend on result.
        }
        else
            return View(contactData));
    }

}

У меня была похожая страница и поведение с ASP.NET WebForms и решение были в том, чтобы поместить три переменных блока разметки в элементы управления asp:Panel, а затем включить или отключить флаг Visible этих панелей из-за кода.Я думаю, мне нужен совсем другой подход с ASP.NET MVC для достижения той же цели.

Какой самый лучший способ?

Спасибо за предложения заранее!

Ответы [ 4 ]

2 голосов
/ 08 мая 2011

Вы можете попробовать так:

    [HttpPost]
    public ActionResult Index(Contact contactData)
    {
        if (ModelState.IsValid)
        {
            ContactService service = new ContactService();
            if (service.Process(contactData))
            {
                TempData["Success"] = "Your success message.";
                return RedirectToAction("Index");
            }
            else
            {
                TempData["Error"] = "Your fail message.";                   
            }
        }
        return View(contact);
    }
2 голосов
/ 07 мая 2011

Возможно, используйте ViewBag, чтобы помочь достичь всего этого. Конечно, это динамика, поэтому вы можете добавлять и проверять любую опору, которую вы хотите / нуждаетесь / ожидаете.

[HttpPost]
public ActionResult Index(ContactData contactData)
{
    if (ModelState.IsValid)
    {
        ContactService service = new ContactService();
        bool result = service.Process(contactData);
        ViewBag.ContactSuccess = true;
    }
    else
    {
        ViewBag.ModelStateErr= "some err";
    }

    return View(contactData));
}

Тогда в вашем представлении:

if (ViewBag.ContactSuccess !=null && ((bool)ViewBag.ContactSuccess))
{
        //thanks for posting!
}
else
{  
    if (ViewBag.ModelStateErr !=null)
    {
        //show that we have an err
    }
    else
    {
        //we have no err nor a 'true' contact success yet
        //write out the form
    }
}
1 голос
/ 08 мая 2011

Я бы посоветовал кодировать три разных представления

  • index.cshtml
  • contactSuccess.cshtml
  • contactFail.cshtml

Тогда в вашем контроллере вы получите код, подобный описанному ранее

public class ContactController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(ContactData contactData)
    {
        if (ModelState.IsValid)
        {
            ContactService service = new ContactService();
            bool result = service.Process(contactData);

            return View("contactSuccess.cshtml"); 
        }
        else
            return View("contactFail.cshtml", contactData);
    }

}

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

В качестве альтернативы (и вот как я это сделаю) вы можете иметь index.cshtml, содержащий три части ...

  • _ContactForm.cshtml
  • _ContactSuccess.cshtml
  • _ContactFail.cshtml

, а затем вы можете загрузить частичные представления в представление индекса и даже динамически поменять их местами с помощью AJAX.

1 голос
/ 08 мая 2011

Похоже, что вы можете выполнить вызов ajax на стороне клиента, а на основе результата Json вы можете визуализировать другой контент на стороне клиента.

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