2010-08-04 80 views
2

在混合和匹配較舊的教程與MVC 3預覽1最近的帖子,我遇到了以下問題。我試圖移動到我的Fighter模型(和基礎數據庫)的JSON驅動編輯,而不是沒有JSON的「普通舊版」編輯。JSON/MVC(3P1)HttpPost - 沒有得到它在我的EF類工作

我有一個編輯視圖(使用Shared EditorTemplate,fighter.ascx)設置我的Fighter類(它存在於EF 4模型中)。

在這我有2個按鈕。一個'老'一個,這是一個提交,沒有JSON調用我的編輯控制器,一個是一個新的,我已經寫了一個新的HttpPost ActionResult

舊按鈕的工作原理:新按鈕只是一半實現但已經可以看到ActionResult UpdateJsonTrick未正確接收視圖中的數據。 returnMessage字符串顯示:系統中的「創建戰士」。「在我可以做任何有用的ActionResult之前,我必須知道如何傳遞這些數據。我哪裏錯了?

所以,edit.aspx只是一個簡單的Html.EditorForModel("Fighter")聲明, 但這裏是Fighter.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc3_EF_BW_Fight.Models.Fighter>" %> 
<% using (Html.BeginForm()) 
    {%> 
<%: Html.ValidationSummary(true) %> 
<script type="text/javascript" src="../../../Scripts/jquery-1.4.1.min.js"></script> 
<script type="text/javascript" src="../../../Scripts/json2.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 

     $("#JSONTRICK").click(function (event) { 

      var fighter = { Id: $('#Id').val(), 
       FighterName: $('#FighterName').val(), 
       FighterStyleDescription: $('#FighterStyleDescription').val(), 
       FighterLongDescription: $('#FighterLongDescription').val() 

      }; 

      $.ajax({ 
       url: '/Barracks/UpdateJsonTrick', 
       type: "POST", 
       data: JSON.stringify(fighter), 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        // get the result and do some magic with it 
        var message = data.Message; 
        $("#resultMessage").html(message); 
       }, 
       error: function() { 
        $('#message').html('oops Error').fadeIn(); 
       } 
      }); 

      return false; 
     }); 


    }); 
</script> 
<fieldset> 
    <legend>Fighter template</legend> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.Id) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.Id) %> 
     <%: Html.ValidationMessageFor(model => model.Id) %> 
    </div> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.FighterName) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.FighterName) %> 
     <%: Html.ValidationMessageFor(model => model.FighterName) %> 
    </div> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.FighterStyleDescription) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.FighterStyleDescription) %> 
     <%: Html.ValidationMessageFor(model => model.FighterStyleDescription) %> 
    </div> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.FighterLongDescription) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextAreaFor(model => model.FighterLongDescription) %> 
     <%: Html.ValidationMessageFor(model => model.FighterLongDescription) %> 
    </div> 
    <p> 
     <input type="submit" value="Save" id="save" /> 
    </p> 
    <p> 
     <input type="submit" value="JSONTRICK" id="JSONTRICK" /> 
     <label id="message"> 
      message</label> 
    </p> 
    <div> 
     <span id="resultMessage"></span> 
    </div> 
</fieldset> 
<% } %> 

這裏是控制器(從相關位):

[HttpPost] 
public ActionResult Edit(int id, FormCollection collection) //Works 
{ 
    var fighter = _FightDb.Fighters.Single(f => f.Id == id); 

    try 
    { 
     UpdateModel(fighter); 
     //var x = ViewData.GetModelStateErrors(); 
     _FightDb.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     var viewModel = _FightDb.Fighters.Single(f => f.Id == id); //fighter; 

     return View(viewModel); 
    } 

} 

[HttpPost] 
public ActionResult UpdateJsonTrick(Fighter fighter) //doesn't work 
{ 
    var x = ViewData.GetModelStateErrors(); 
    string returnMessage = string.Format("Created fighter '{0}' in the system.", fighter.FighterName); 
    return Json(new PersonViewModel { Message = returnMessage }); 

} 

感謝您的耐心等待,如果您需要額外的代碼或信息,我可以提供。

回答

1

MVC 3 Preview 1中存在一個缺陷,其中JsonValueProviderFactory未默認註冊。

在你的Global.asax這樣的事情應該有所幫助:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()) 
+0

我就可以測試這個今天晚些時候,將讓你儘快知道。 TX。 – Tobiasopdenbrouw 2010-08-05 05:41:39

+0

它的工作原理。 TX! – Tobiasopdenbrouw 2010-08-05 07:17:09