2014-10-30 66 views
1

我有一個應用程序,主要是在此處使用ET 6 DB First +控制器/視圖腳手架生成的。我對從我的控制器發佈Razor的概念感到困惑。基本上我的數據並沒有超過DOM在Http Post的剃刀中使用@model時出現混亂

這裏是我的控制器:(不介意驗證設置,這不是一個面向公衆的應用程序)

namespace RegTeg.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private VRIIntegrationEntities db = new VRIIntegrationEntities(); 
     public ActionResult Index() 
     { 

      return View(db.ApplicationNames.ToList()); 
     } 


     [HttpPost] 
     // [ValidateAntiForgeryToken] 
     [ValidateInput(false)] 
     public ActionResult Index([Bind(Include = "appName")] RegTeg.Models.ApplicationName newAppName) 
     { 
      if (ModelState.IsValid) 
      { 
       db.ApplicationNames.Add(newAppName); 
       db.SaveChanges(); //fails here due to a null column 
       return RedirectToAction("Index"); 
      } 

      return View(newAppName); 
     } 

    } 
} 

所以,我有我的指數中,我提供一個列表視圖,以便我能在訪問該頁面時將數據從我的數據庫顯示給用戶。在這個頁面上還有一個帖子,他們可以添加一些東西給DB。我將它傳遞給我的模型的一個實例,然後插入到表格中。所以這很好(所以我認爲)。

現在對於我的看法:

@model IEnumerable<RegTeg.Models.ApplicationName> 

<div> 
    <select class="applicationSelect"> 
     @foreach (var item in Model) 
     { 
      <option> 
       @Html.DisplayFor(modelItem => item.appName) 
      </option> 
     } 
    </select> 
</div> 

@using (Html.BeginForm()) 
{ 
    RegTeg.Models.ApplicationName appModel = new RegTeg.Models.ApplicationName(); 
    <div class="form-horizontal"> 
     @Html.ValidationSummary(true) 
     @Html.AntiForgeryToken() 

     <h3>Add New Application for Testing:</h3> 
     <div class="form-group"> 
      @Html.LabelFor(model => appModel.appName, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => appModel.appName) 
       @Html.ValidationMessageFor(model => appModel.appName) 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

我通過我的強類型的模型。在我的foreach循環中獲取數據...好吧,完成了,現在我想對我的服務器做一個帖子,並將新的數據添加到我的數據庫。我創建了這個模型的一個新實例,從我的輸入中提取數據並繁榮,然後提交。但問題是,數據是null。我有一個預感,它與我的@model聲明有關。例如,該帖子需要一個@model RegTeg.Models.ApplicationName但是我認爲當我在我的視圖中稍後聲明新實例時沒有必要?我希望我表達得很好。提前致謝。

+2

看起來像最初你傳遞一個列表,但在您只將單個項目傳遞給視圖,但您的視圖期待列表。 – 2014-10-30 16:23:06

+0

@MikeC。這就是我的想法,那麼你會如何推薦這兩個?傳入數據庫VRIIntegrationEntity。從視圖中構建一個列表和一個模型實例?我想我不知道如何處理兩者? – 40Alpha 2014-10-30 16:29:20

+1

在您的文章ActionMethod中,構建一個列表並將其添加到該列表中,然後繼續按照您的視圖所期望的傳遞列表。 – 2014-10-30 16:30:22

回答

1

問題1其他解決方案:

我估計你還想顯示你的所有應用程序,所以我建議你在開始做什麼之後建模你的帖子:

[HttpPost] 
// [ValidateAntiForgeryToken] 
[ValidateInput(false)] 
public ActionResult Index([Bind(Include = "appName")] RegTeg.Models.ApplicationName newAppName) 
{ 
    if (ModelState.IsValid) 
    { 
     db.ApplicationNames.Add(newAppName); 
     db.SaveChanges(); //fails here due to a null column 
     return RedirectToAction("Index"); 
    } 
    //continue to return a list as your view is expecting 
    //if you REALLY want only the item that you just created, then construct a list, 
    //add that to it, and return that instead of the full list 
    return View(db.ApplicationNames.ToList()); 
} 

問題2:

看看您的HTML。你需要做的是確保你的文本框的NAME屬性和你的ActionMethod的變量名相同。例如,如果你的文本是這樣的:

<input type="text" name="appName" id="appName" /> 

然後我會建議擺脫你有約束力的東西,只是這樣做:

[HttpPost] 
// [ValidateAntiForgeryToken] 
[ValidateInput(false)] 
public ActionResult Index(RegTeg.Models.ApplicationName appName) 
{ 
    ... existing code here ... 
}