простая форма сообщения MVC и вопрос маршрутизации URL .... Я надеюсь - PullRequest
1 голос
/ 27 октября 2010

У меня есть представление под названием «Ассоциации», в котором есть раскрывающийся список и кнопка. Когда пользователь выбирает опцию и нажимает «отправить», я хочу, чтобы он пошел в Association / {associationKey}. Ассоциация должна работать на получение и должность.

В настоящее время с кодом, приведенным ниже, когда форма публикуется, она отправляется в Ассоциацию и отображает правильную запись, НО она не добавляет ключ ассоциации к URL-адресу.

Итак, я получаю:

http://localhost/Association

вместо:

http://localhost/Association/202

Если я вручную перехожу к http://localhost/Association/202, все работает отлично, так что get и post оба работают нормально ... Мне просто нужен ключ в URL после сообщения!

Конечно, должно быть что-то очень простое, я делаю не так. Соответствующий код ниже.

Спасибо!

АССОЦИАЦИИ:

<% Html.BeginForm("Association", "Staff", FormMethod.Post); %>
<%:Html.DropDownList("associationKey", new SelectList(Model.Associations.ToList(), "AssociationKey", "LegalName"))%>
<input type="submit" value="Edit The Selected Record" />
<% Html.EndForm(); %>

STAFF контроллер:


        [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
        public ActionResult Association(int associationKey)
        {
            return View("Association", new AssociationViewModel(associationKey));
        }

global.asax:


        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute("Default", "{action}", new { controller = "Staff", action = "Default" });
            routes.MapRoute("Associations", "Associations", new { controller = "Staff", action = "Associations" });
            routes.MapRoute("Association", "Association/{associationKey}", new { controller = "Staff", action = "Association" });
        }

АССОЦИАЦИЯ посмотреть модель:


    public class AssociationViewModel
    {

        public Repository db = new Repository();

        public Association Association {get; private set; }

        public List TelephoneTypes { get; private set; }

        public AssociationViewModel(int associationKey)
        {
            Association = db.AssociationById(associationKey);
            TelephoneTypes = db.ListTelephoneTypes().ToList();
        }

    }

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Я думаю, что вы должны разделить действия вашего контроллера на действие Get и действие POST следующим образом:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Association(int associationKey)
{
    return View("Association", new AssociationViewModel(associationKey));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Association(AssociationViewModel model)
{
    return RedirectToAction("Association", new {associationKey= model.associationKey});
}

Среда MVC автоматически свяжет выбранное значение из списка SelectList с моделью (при условии, что у вас есть свойство в модели для хранения выбранного значения). Оттуда вам просто нужно перенаправить на ваш метод GET, передав ключ.

1 голос
/ 27 октября 2010

Это делает сообщение вместо GET.Это помещает значение в параметры формы, а не в URL.Вы можете перехватить отправку формы, используя javascript, и превратить ее в GET, используя location=..

<script type="text/javascript">
    $(function() { // requires jQuery
        $('form').submit( function() {
            // maybe do some validation to ensure a legal value chosen first?
            location.href = $(this).attr('action') + '/' + $(this).find('select').value();
            return false;  // cancel submit
        });
    });
</script>

<% Html.BeginForm("Association", "Staff", FormMethod.Post); %> 
<%:Html.DropDownList("associationKey", new SelectList(Model.Associations.ToList(), "AssociationKey", "LegalName"))%> 
<input type="submit" value="Edit The Selected Record" /> 
<% Html.EndForm(); %>
...