Лучшая практика ASP.NET MVC для различения методов действия GET / POST с одинаковой сигнатурой? - PullRequest
3 голосов
/ 02 июля 2010

При реализации действия Edit я добавляю два метода для Get и Post: Edit (идентификатор строки)

В идеале они должны иметь одинаковую подпись. Но, конечно, это не компилируется. Поэтому я добавляю фиктивный параметр в метод HttpPost ( form в моем случае):

[HttpGet]
public ActionResult Edit(string id)
{
    var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
    return View(user);
}

[HttpPost]
public ActionResult Edit(string id, FormCollection form)
{
    var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
    if (TryUpdateModel<User>(user, new[] { "Email", "FullName" }))
    {
        Entities.SaveChanges();
        RedirectToAction("Index");
    }
    return View(user);
}

Есть ли лучший / более чистый способ реализации действия редактирования?

Ответы [ 4 ]

7 голосов
/ 13 января 2011

Дайте методам уникальное имя в контроллере, например. добавьте "_POST" в качестве суффикса. Затем вы можете использовать атрибут [ActionName("actualname")], чтобы пометить ваш метод именем вашего действия.

0 голосов
/ 09 июля 2010

Почему бы не

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(string id,FormCollection form)  

и

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit(string id)  

Это приведет к тому, что соответствующий HTTP-запрос будет обработан правильным методом

0 голосов
/ 10 июля 2010

Сообщение должно иметь идентификатор в модели IMO:

[HttpGet]
public ActionResult Edit(string id)
{
    var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
    return View(user);
}

[HttpPost]
public ActionResult Edit(User user)
{        
    if (TryUpdateModel<User>(user, new[] { "Email", "FullName" }))
    {
        Entities.SaveChanges();
        RedirectToAction("Index");
    }
    return View(user);
}
0 голосов
/ 02 июля 2010

Я бы объединил их в одно:

public ActionResult Edit(string id)
{
    if (Request.HttpMethod == "GET") {
        var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
        return View(user);
    }

    // POST logic
}
...