【问题标题】:ASP.NET MVC Standard Link/Href As Save Button And Model IS NUllASP.NET MVC 标准链接/Href 作为保存按钮和模型为空
【发布时间】:2009-01-16 14:59:55
【问题描述】:

好的,我对 MVC 完全陌生,我正在尝试围绕一些概念进行思考。我创建了一个小应用程序...

此应用程序具有用于创建新个人记录的视图。视图绑定到模型 ViewPage...而且我有一个关联的 IndividualController,它有一个 New 方法...

IndividualController 的 New 方法如下所示...

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 方法的输入参数为空;即使我在名字文本框中输入一个值...

显然我做错了什么。谁能帮我直说...

提前谢谢...

【问题讨论】:

    标签: c# asp.net-mvc html-helper


    【解决方案1】:

    您的新控制器方法不需要创建个人,您可能只希望它设置标题并返回视图,尽管您可能需要进行一些授权处理。这是我的一个项目中的一个示例:

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

    您的 Save 操作应该从表单中获取输入并创建一个新模型实例并将其持久化。我的例子比我想在这里发布的要复杂一些,所以我会尝试简化它。请注意,我使用的是 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 } );
             }
        }
    

    【讨论】:

      【解决方案2】:

      如果我没有在 New 方法中创建一个新的 Indvidual 对象,那么当我的视图尝试将文本框绑定到关联模型时,我会在我的视图中的下面一行收到 NullReferenceException...

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

      关于 Save 方法。据我了解,由于我的视图是强类型的,我不应该能够拥有像...这样的方法签名。

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

      我认为这是模型绑定背后的目的..?

      【讨论】:

      • Jason,你能阅读一下在 SO 中使用 markdown 的文档吗? stackoverflow.com/editing-help,对于嵌入在普通段落文本中的关键字,您正在缩进代码并用 . Use 分隔它。对于代码示例,您只需缩进 4 个空格。
      • 另请注意,SO 不是论坛或新闻组。大多数人按投票顺序阅读问题的答案,因此任何使用答案来继续对话的做法都注定要失败。如果想对答案发表评论,请使用添加 cmets 功能。
      【解决方案3】:

      我强烈建议您退后一步,在 http://www.asp.net/learn/ 处浏览一些教程/视频

      如果您有一个强类型的View,这意味着当Controller 选择该视图来生成输出时,该视图可以更好地访问@987654324 @。

      但是,View负责随后从客户端返回的内容,例如发布表单或以其他方式导航到的 URL。 p>

      ASP.NET-MVC 使用 URL 中的信息来确定将请求交给哪个 Controller。之后,控制器负责将请求中的各种其他元素解析为 Model 类的实例。

      传入请求和控制器之间的关系因 ASP.NET-MVC 路由为控制器提供的重要帮助而变得模糊不清。例如,可以定义一个路由来为控制器方法提供参数,这就是控制器所需要的,因此您看不到与 http 请求相关的方法中的任何代码。不过应该理解,控制器方法只是处理一个http请求。

      我希望您可以从上面看到,在请求生命周期中,将模型中的类实例传递给控制器​​上的公共方法还为时过早。如果需要实例化,由控制器决定哪些模型类。

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2015-06-24
        相关资源
        最近更新 更多