2011-03-18 53 views
0

我嘗試創建一個asp.net mvc3應用程序。HttpPost編輯更新我的模型的動作

這是我的觀點:

@model Iads.Elrams.Data.Entities.Page 
@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <div class="formElement"> 
      <div class="formFieldLabel"> 
       @Html.LabelFor(model => model.ExternalLink) 
      </div> 
      <div class="formField"> 
       @Html.TextBoxFor(model => model.ExternalLink, new { style = "width:400px" }) 
      </div> 
     </div> 
    <div class="border content"> 
     <div id="tabs" style="margin-top: 20px;"> <!-- jquery UI --> 
      <div class="tabMenu"> 
       <ul> 
        @foreach (Iads.Elrams.Data.Entities.Language lang in ViewBag.Languages) { 
         <li><a href="#@lang.Iso2">@lang.Name</a></li> 
        } 
       </ul> 
      </div> 
      @{ 
       foreach (Data.Entities.Language lang in ViewBag.AvailableLanguages) { 
        <div id="@lang.Iso2" class="border tabMenuContent"> 
         <div class="formElement"> 
          <div class="formFieldLabel"> 
           @Html.LabelFor(model => model.GetTextOrDefaultByLang(lang.Iso2).Title) * <!-- Object: PageText --> 
          </div> 
          <div class="formField"> 
           @Html.EditorFor(model => model.GetTextOrDefaultByLang(lang.Iso2).Title, new { style = "width:400px" }) 
          </div> 
         </div> 
         <div class="formElement"> 
          <div class="formFieldLabel"> 
           @Html.LabelFor(model => model.GetTextOrDefaultByLang(lang.Iso2).NavText) * 
          </div> 
          <div class="formField"> 
           @Html.EditorFor(model => model.GetTextOrDefaultByLang(lang.Iso2).NavText, new { style = "width:400px" }) 
          </div> 
         </div> 
        </div> 
       } 
      } 
     </div> 
     <p> 
      <input type="submit" value="save" class="button" /> 
      <input type="button" class="lightbutton" value="cancel" onclick="location.href = '@Url.RouteUrl(new RouteValueDictionary(new { 
        area = "Cms", 
        controller = "Page", 
        action = "Index" 
       }))';" /> 
     </p> 
    </div> 
} 

在這裏,我的頁面控制器:


public ActionResult Edit(int id) { 
    Page page = pageRepository.GetById(id); 
    if(page == null) 
     return new HttpNotFoundResult(); 

    IEnumerable languages = languageRepository.GetAll(); 
    languages = languages.OrderBy(m => m.LanguageId); 
    ViewBag.AvailableLanguages = languages; 
    return View(page); 
} 

[HttpPost] 
public ActionResult Edit(what are the parameters???) { 
    // ????? 
    return View(page); 
} 

我想在頁面作爲參數,但這並不與PageTexts工作!

我的參數是什麼?我的方法應該如何看待?

任何幫助,將不勝感激。

謝謝!

+0

它會被表單發送嗎? – SLaks 2011-03-18 17:45:54

+0

是的,它是由管理控制面板中的表單發佈 – user611684 2011-03-18 18:15:35

+0

默認的模型聯編程序不應該處理這個嗎?在這種情況下: public ActionResult Edit(Iads.Elrams.Data.Entities.Page頁面) – WorldIsRound 2011-03-18 19:24:02

回答

0

我想你的情況下,你會使參數a Iads.Elrams.Data.Entities.Page。您也可以將其設置爲FormCollection並以這種方式獲取請求項目。

這裏有一對夫婦的更新類型的方法我做:

<HttpPost()> 
Function Transfer(ByVal collection As FormCollection) 
... 
End Function 

<HttpPost()> 
Function Update(ByVal visit As VisitSummaryViewModel) 
... 
End Function 
+0

但是,如果我至少有兩種可用的語言,它們具有相同的名稱和ID(Title和NavText)。那麼我怎樣才能解決這些領域?我如何閱讀這些字段? – user611684 2011-03-18 18:22:40

+0

我還沒有在MVC中嘗試過這一點,但在具有相同標記的經典ASP項目中,會以數組的形式到達頁面。嘗試通過formscollection進行訪問。即集合[「標題」] [0]。 – BlackICE 2011-03-19 14:50:06

0
// 
// GET: /controllername/Edit/ 
public ActionResult Edit() 
{ 
    var langer = from lang in globalizationdb.langs select langs; 
    ViewData["listlang"] = langer; 
} 

// 
// POST: /controllername/Edit/ 
[HttpPost] 
public ActionResult Edit(int id, FormCollection collection) { 
       //dbcontext //dbname   //id field 
var languages = globalizationdb.lang.Where(x => x.lang_id == id).Single(); 

    long langish = Convert.ToInt64(collection["langfield"]); 
    //get the lang id , im asuming u gonna use dropdownlist for lang... 
    lang.lang_id = langish; 

    //dbcontext 
    globalizationdb.SubmitChanges(); 
    return RedirectToAction("Index"); 
} 

也在查看 ///控制器的名稱應該是沒有布拉布拉「控制器」在結束像CatController應該只有貓..

@using (Html.BeginForm("Edit", "yourControllername", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div class="editor-label">Lang ID</div> 
    <div class="editor-field"> 
     //lang field as dropdownlist 
     @Html.DropDownList("langfield", new SelectList((System.Collections.IEnumerable)ViewData["listlang"], "lang_id", "lang_name",Model.lang)) 
     @Html.ValidationMessageFor(model => model.lang_id) 
    </div> 
} 

在你使用FormMethod.Post, new { enctype = "multipart/form-data" }之後窗體啓動你可以使用FormCollection方法。

u能也用這個烏爾自己做分貝的..

0

可以使用的FormCollection和處理鍵值對,但是這不是一個完美的解決方案。我建議使用與Iads.Elrams.Data.Entities.Page截然不同的單獨視圖模型類,然後可以使用類似AutoMapper的庫來幫助您映射值。視圖模型和數據庫模型可能有很大差異,您可以通過設計不同的類(驗證,自定義邏輯等)來獲得更大的靈活性。

在你的情況,我會創建一個PageViewModel類,其中包含PageLanguageViewModel類的集合。另外,在視圖中,我將使用「for(i = 0; ...)」循環,以便html輸入擴展方法爲此集合創建合適的名稱和ID。而你的post參數將是PageViewModel類的一個實例。 ASP.NET Mvc模型綁定也適用於集合類型。但是,在視圖中動態刪除或添加項目時有一個技巧,因爲您必須維護正確的索引。