2013-04-23 77 views
1

我是新来的asp.net MVC。在下面的代码中,我试图添加一条记录到数据库。它工作正常,但它每次加载视图时都会向数据库添加一条空记录。加载视图时添加空记录

型号:

public class multi 
    { 
     public int CategoryID { get; set; } 


     public string CategoryName { get; set; } 
     public string Description { get; set; } 

     public string DisplayName { get; set; } 
     public string Email { get; set; } 
    } 



public class CategoryRepository 
    { 

private BusDataClassesDataContext dc = new BusDataClassesDataContext(); 

public void Save() 
     { 
      dc.SubmitChanges(); 
     } 

     public void AddMulti(multi mu) 
       { 
        tblCategory cat = new tblCategory(); 
        cat.CategoryName = mu.CategoryName; 
        cat.Description = mu.Description; 

        tblUser user = new tblUser(); 
        user.DisplayName = mu.DisplayName; 
        user.Email = mu.Email; 

        dc.tblCategories.InsertOnSubmit(cat); 
        dc.tblUsers.InsertOnSubmit(user); 
       } 
    } 

控制器:

CategoryRepository cat = new CategoryRepository(); 

    public ActionResult AddMulti(multi mu) 
      { 
       if (ModelState.IsValid) 
       { 
        cat.AddMulti(mu); 
        cat.Save(); 
        return View(mu); 

       } 
       else 
       { 
        return View(mu); 

       } 
      } 

查看:

<% using (Html.BeginForm()) {%> 
     <%: Html.ValidationSummary(true) %> 

     <fieldset> 
      <legend>Fields</legend> 


      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.CategoryName) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.CategoryName) %> 
       <%: Html.ValidationMessageFor(model => model.CategoryName) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Description) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Description) %> 
       <%: Html.ValidationMessageFor(model => model.Description) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.DisplayName) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.DisplayName) %> 
       <%: Html.ValidationMessageFor(model => model.DisplayName) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Email) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Email) %> 
       <%: Html.ValidationMessageFor(model => model.Email) %> 
      </div> 

      <p> 
       <input type="submit" value="Create" /> 
      </p> 
     </fieldset> 

    <% } %> 

    <div> 
     <%: Html.ActionLink("Back to List", "Index") %> 
    </div> 
+0

你是否缺少模型中的[[Required]]? – 2013-04-23 07:40:06

回答

1

这是因为你没有验证在你的模型上,所以ModelState.IsValid总是如此。然后,您通过AddMulti添加一个新类别。由于此控制器方法是唯一指定的方法,因此它用于GET和POST请求。这意味着,每次加载页面并渲染表单时,都会在模型中创建一个空值的新记录。

尝试分裂您的控制器伸到HttpPostHttpGet方法:

[HttpPost] 
public ActionResult AddMulti(multi mu) 
{ 
    if (ModelState.IsValid) 
    { 
     cat.AddMulti(mu); 
     cat.Save(); 
     return View(mu); 
    } 
    else 
    { 
     return View(mu); 
    } 
} 

[HttpGet] 
public ActionResult AddMulti() 
{ 
    return View(); 
} 

现在,当您通过GET请求访问的网页(即当您第一次访问它,发布形式之前),第二个动作方法被激发,所以你不会创建新的记录。

您还可能想要为模型添加一些验证属性。因为它看起来像是将域模型直接传递给视图,所以还应该考虑创建单独的view models

+0

你好,我添加HttpPost在我的控制器method.Now我得到“404页未找到错误” – chamara 2013-04-23 07:56:58

+0

这是因为你还需要创建上面显示的'HttpGet'方法。现在您的以前的方法只是POST,除非您创建单独的方法,否则没有任何操作可以处理GET请求。 – 2013-04-23 07:58:34

+0

我在哪里添加此方法?无法在同一个cotroller类中添加相同参数类型的方法 – chamara 2013-04-23 08:08:00