ASP.NET MVC Standard Link / Href как кнопка сохранения и модель пуста - PullRequest
0 голосов
/ 16 января 2009

Хорошо, я совершенно новичок в MVC и пытаюсь обдумать некоторые концепции. Я создал небольшое приложение ...

Это приложение имеет вид для создания новой индивидуальной записи. Представление привязано к модели ViewPage ... И у меня есть связанный IndividualController , который имеет Новый метод ...

Новый метод IndividualController выглядит следующим образом ...

public ActionResult New()
    {
        var i = new Individual();

        this.Title = "Create new individual...";
        i.Id = Guid.NewGuid();

        this.ViewData.Model = new Individual();


        return View();
    }

Теперь, похоже, все вышеперечисленное работает. Когда представление загружается, я могу получить данные из индивидуального объекта. Проблема вступает в игру, когда я пытаюсь сохранить данные обратно через контроллер ...

В моем IndividualController у меня также есть метод Save , который принимает входящий параметр типа Individual . Метод выглядит как ...

   public ActionResult Save(IndividualService.Individual Individual)
    {
        return RedirectToAction("New");
    }

Теперь, на мой взгляд, я хотел использовать стандартную ссылку html / href для использования в качестве кнопки «Сохранить», поэтому я определил ActionLink следующим образом ...

 <%=Html.ActionLink("Save", "Save") %>

Кроме того, на мой взгляд, я создал одно текстовое поле для хранения имени в качестве теста, например ...

 <% using (Html.BeginForm()) { %>
     <%=Html.TextBox("FirstName", ViewData.Model.FirstName)%>
 <% } %>

Итак, если я поставлю точку останова в методе Save и нажму на ссылку «Сохранить», на мой взгляд, точка останова попадет в мой контроллер. Проблема в том, что входной параметр метода Save имеет значение null; даже если я введу значение в текстовое поле имени ...

Очевидно, я делаю что-то совершенно не так. Может кто-нибудь поправит меня ...

Заранее спасибо ...

Ответы [ 3 ]

1 голос
/ 16 января 2009

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

    [AcceptVerbs( HttpVerbs.Get )]
    [Authorization( Roles = "SuperUser, EditEvent, EditMasterEvent")]
    public ActionResult New()
    {
        ViewData["Title"] = "New Event";
        if (this.IsMasterEditAllowed())
        {
            ViewData["ShowNewMaster"] = "true";
        }

        return View();
    }

Ваше действие Сохранить должно взять входные данные из формы, создать новый экземпляр модели и сохранить его. Мой пример немного сложнее, чем то, что я хотел бы опубликовать здесь, поэтому я постараюсь упростить его. Обратите внимание, что я использую FormCollection, а не привязку модели, но вы также должны иметь возможность заставить это работать.

    [AcceptVerbs( HttpVerbs.Post )]
    [Authorization( Roles = "SuperUser, EditEvent, EditMasterEvent")]
    public ActionResult Save( FormCollection form )
    {
         using (DataContext context = ...)
         {
              Event evt = new Event();
              if (!TryUpdateModel( evt, new [] { "EventName", "CategoryID", ... }))
              {
                  this.ModelState.AddModelError( "Could not update model..." );
                  return View("New");  // back to display errors...
              }
              context.InsertOnSubmit( evt );
              context.SubmitChanges();
              return RedirectToAction( "Show", "Event", new { id = evt.EventID } );
         }
    }
0 голосов
/ 16 января 2009

Я настоятельно рекомендую вам сделать шаг назад по сравнению с тем, что вы делаете, и просмотреть некоторые уроки / видео здесь http://www.asp.net/learn/

Если у вас строго типизированный View, это означает, что когда Controller выбирает это представление для генерации вывода , представление имеет лучший доступ к Model.

Однако View является , а не , ответственным за то, что впоследствии возвращается клиенту, например, когда форма публикуется или URL-адрес перемещается иным образом.

ASP.NET-MVC использует информацию в URL-адресе, чтобы определить, к какому Controller передать запрос. После этого ответственность за преобразование различных других элементов в запросе в экземпляр (ы) Model классов.

Отношения между входящим запросом и контроллером затуманены значительной помощью, которую маршрутизация ASP.NET-MVC оказывает контроллеру. Например, может быть определен маршрут для предоставления параметров в метод контроллера, и это все, что нужно контроллеру, и, следовательно, вы не видите никакого кода в методе, относящемся к http-запросу. Однако следует понимать, что метод контроллера является простой обработкой http-запроса.

Я надеюсь, что из вышесказанного видно, что было бы слишком рано в жизненном цикле запросов для экземпляра класса из модели передавать в открытый метод на контроллере. Это зависит от контроллера, чтобы определить, какие классы модели, если таковые имеются, нужно создавать.

0 голосов
/ 16 января 2009

Если я не создаю новый объект Indvidual в методе New, то когда мое представление пытается привязать текстовое поле к связанной модели, я получаю исключение NullReferenceException в строке ниже в моем представлении ...

`<%=Html.TextBox("FirstName", ViewData.Model.FirstName)%>`

Относительно метода Save. Из того, что я понимаю, так как мое мнение строго типизировано, я не должен иметь возможность подписи метода, как ...

   `public ActionResult New(IndividualService.Individual ind)
    {
        return View();
    }`

Я думал, что это было целью привязки модели ..?

...