2012-07-09 38 views
2

我在Windows 2008 R2服務器(IIS 7.5)上運行一對經典的ASP網站,並添加了一個簡單的MVC3電子商務網站。問題是當我嘗試使用表單從產品頁面添加項目到購物車時。使用剃刀語法,我有以下代碼:MVC3 - 空值發佈到行動

@using (Html.BeginForm("Add", "Cart", FormMethod.Post, new { })) 
{ 
    @Html.HiddenFor(m => m.Id) 
    @Html.TextBoxFor(m => m.Quantity, new { size = "1" }) 
    <input type="submit" value="Add to Cart"/> 
} 

public class AddToCartViewModel 
{ 
    public string Id { get; set; } 
    public int Quantity { get; set; } 
} 

[HttpPost] 
public ActionResult Add(AddToCartViewModel cartItem) 
{ 
    // Code that adds the item to the cart 

    // Go back to the product page 
    return RedirectToAction("Model", "Product", new { id = cartItem.Id }); 
} 

的問題是,ModelId和數量沒有被填充在表單中的數據。 cartItem不爲空,並且正在調用此操作。此代碼在通過Visual Studio 2010運行時運行良好,因此我猜測它是服務器和/或IIS配置設置。奇怪的是,我有另一個購物車的頁面,允許用戶更新他們的購物車中的物品數量,這非常有效。該頁面更復雜,因爲它在視圖模型中使用了一個列表,所以我看不出爲什麼我的簡單請求失敗。

使用ActionLink(具有硬編碼數量)而不是表單工作。

@Html.ActionLink("Add to cart", "Add", "Cart", new { Id = Model.Id, Quantity = 1}, new {}) 

我試着改變action方法的簽名來取一個字符串和一個int,但是因爲數量爲null而拋出一個異常。

抓住吸管,我跑了以下來確保.NET 4.0已經註冊,看起來很好。我有2.0.50727.0和部署應用4.0.30319.0

斌的X32和x64版本按Phil Haack's instructions沒有工作,要麼

我的想法,因爲一切都在Visual Studio中的作品,和我無法找到與此相同問題的其他帖子。我只是想念一些簡單的東西?此外,我只注意到通過帳戶控制器登錄也無法在服務器上工作。沒有顯示錯誤或驗證問題。我正在使用默認的成員資格提供程序,但web.config被配置爲使用我自己的數據庫。該連接起作用,因爲我可以註冊一個新用戶,並且新用戶在成功註冊時登錄。

+0

@OmerAmsel是的,它的聲明和填充。該表單在頁面上具有正確的值。該表單位於強類型局部視圖中,其中'AddToCartViewModel'作爲其模型。我發佈的是部分視圖,只減去模型聲明。 – tehrustine 2012-07-09 18:26:57

+0

調試操作方法並檢查請求,確保您的值位於實際的Post中,並且它們與模型中的屬性具有相同的確切名稱。 – 2012-07-09 18:27:48

回答

0

使用強類型的HTML輔助

@Html.HiddenFor(m => m.Id)  
@Html.TextBoxFor(m => m.Quantity, new { size = "1" }) 

,並確保已打上了行動[HttpPost].

+0

我在我的代碼中改變了這一點,並將更新帖子以匹配,但我仍然得到相同的結果。 – tehrustine 2012-07-09 17:47:16

1

[編輯]

OK,更新現在你已經更新您的回答題。我認爲這個問題很可能是由於您在添加操作的初始獲取請求中沒有初始化模型。嘗試添加HttpGetHttpPost按如下:

[HttpGet] 
public ActionResult Add() 
{ 
    var viewModel = new AddToCartViewModel() 
    { 
     Id = "myid", 
     Quantity = 0 
    }; 
    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Add(AddToCartViewModel cartItem) 
{ 
    // Code that adds the item to the cart 

    // Go back to the product page 
    return RedirectToAction("Model", "Product", new { id = cartItem.Id }); 
} 

我敢肯定,這將現在的工作。

+0

謝謝你指出。不幸的是,這是一個複製/粘貼錯誤,因爲AddToCartViewModel沒有ModelId。雙重檢查後,我的原始代碼確實使用cartItem.Id。我在文章中糾正了這一點,並添加了[HttpPost]屬性。 – tehrustine 2012-07-09 17:37:30

+0

tehrustine - 更新我的答案,以反映您最近的變化。相信這會對你有用。 :-0 – 2012-07-09 19:32:21

+0

這就是它應該如何工作的原理,並且它在運行Visual Studio 2010時完美無瑕。但是,我的問題是,在服務器上部署時,它不起作用。 – tehrustine 2012-07-09 20:34:44