MVC3 Actionlink с отправкой - PullRequest
       1

MVC3 Actionlink с отправкой

1 голос
/ 19 марта 2012

Я новый пользователь MVC и пытаюсь сделать корзину покупок следующим образом Учебное пособие по музыкальному магазину MVC

Я пытаюсь передать значение radiobutton, которое имеет разные типы цен, через actionlink.Можно ли передать значение с productId?Когда я нажимаю на ссылку, она вызывает метод AddToCart.Не могли бы вы помочь мне?спасибо.

Модель продукта

namespace MvcApplication2.Models
{
public class Product
{
    [Key] public int productId { get; set; }
    public int categoryId { get; set; }
    [Required(ErrorMessage = "Product model name is required")]
    public String model { get; set; }
    [DisplayFormat(DataFormatString = "{0:0.#}")]
    public decimal displaySize { get; set; }
    public String processor { get; set; }
    public int ramSize { get; set; }
    public int capacity { get; set; }
    public String colour { get; set; }
    public String description { get; set; }
    public decimal price { get; set; }
    public decimal threeDayPrice { get; set; }
    public decimal aWeekPrice { get; set; }
    public decimal twoWeekPrice { get; set; }
    public decimal aMonthPrice { get; set; }
    public decimal threeMonthPrice { get; set; }
    public decimal sixMonthPrice { get; set; }
    //public decimal sixMonthPrice { get { return price * 0.25M; } }
    public int stock { get; set; }
    public virtual Category Category { get; set; }
}
}

details.cshtml

@model MvcApplication2.Models.Product
<td>
        Rental Period: <br />
        @using (Html.BeginForm())
        { 
            <div class="display-label">
            @Html.RadioButtonFor(model => model.price, Model.threeDayPrice) 
            3 day: £@Model.threeDayPrice
            </div>
            <div class="display-label">
            @Html.RadioButtonFor(model => model.price, Model.aWeekPrice)
            1 week: £@Model.aWeekPrice 
            </div>
            <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.twoWeekPrice)
            2 week: £@Model.twoWeekPrice 
            </div>
            <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.twoWeekPrice)
            1 month: £@Model.twoWeekPrice 
            </div>
            <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.threeMonthPrice)
            3 month: £@Model.threeMonthPrice 
            </div>
            <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.sixMonthPrice)
            6 month: £@Model.sixMonthPrice 
            </div>
        }      
    </td>
</tr>
</table>
<p class="button" style="margin-left:200px; width:90px;">
    //Is it possible to submit the selected radiobutton value through this?
    @Html.ActionLink("Add to cart", "AddToCart", "ShoppingCart", new { id = Model.productId }, "")
</p>

--- Добавлен контроллер --- ShoppingCartController.cs

 public ActionResult AddToCart(int id)
    {
        // Retrieve the product from the database
        var addedProduct = db.Product
            .Single(product => product.productId == id);

        // Add it to the shopping cart
        var cart = ShoppingCart.GetCart(this.HttpContext);

        cart.AddToCart(addedProduct);

        // Go back to the main store page for more shopping
        return RedirectToAction("Index");
    }

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Просто используйте кнопку отправки вместо ActionLink. Таким образом, все входные значения будут отправлены в контроллер при отправке формы:

@model MvcApplication2.Models.Product
<td>
    Rental Period: <br />
    @using (Html.BeginForm("AddToCart", "ShoppingCart", new { id = Model.productId }, FormMethod.Post))
    { 
        <div class="display-label">
            @Html.RadioButtonFor(model => model.price, Model.threeDayPrice) 
            3 day: £@Model.threeDayPrice
        </div>
        <div class="display-label">
            @Html.RadioButtonFor(model => model.price, Model.aWeekPrice)
            1 week: £@Model.aWeekPrice 
        </div>
        <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.twoWeekPrice)
            2 week: £@Model.twoWeekPrice 
        </div>
        <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.twoWeekPrice)
            1 month: £@Model.twoWeekPrice 
        </div>
        <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.threeMonthPrice)
            3 month: £@Model.threeMonthPrice 
        </div>
        <div class="display-label">
            @Html.RadioButtonFor(model => model.price, @Model.sixMonthPrice)
            6 month: £@Model.sixMonthPrice 
        </div>

        <button type="submit">Add to cart</button>
    }      
</td>
0 голосов
/ 19 марта 2012

Поскольку вы сразу говорите, что вы новичок, я скажу вам, что то, как вы это делаете, не лучший способ достичь того, чего вы пытаетесь достичь.

Если поместить кнопку отправки внизу формы, вы получите данные для публикации и привязки к продукту, если вы измените верхнюю часть формы на

@using (Html.BeginForm("AddToCart", "WHATEVERYOURCONTROLLERISCALLED"))

но я думаю, что здесь вам не хватает нескольких ключевых моментов.

Есть некоторые соглашения, которые вы, кажется, игнорируете

ShoppingCart.cs должен называться ShoppingCartController.cs и находиться в папке контроллеров вашего проекта

Вместо того, чтобы называть каждую цену в модели, вы можете использовать список вариантов цен и отображать их в форме в виде серии переключателей, оставляя взаимоисключающий выбор. например.

Модель

public class Product{

// remove all the different price properties. 

// other properties go here...And while you are at it Use Pascal case for property names Eg. displaySize would be DisplaySize but I guess that is up to you.

[Required]
public string PriceChoice { get; set; }

}

Контроллер

public class ShoppingCartController : Controller
{

public ActionResult Details(int productId)
{
   // get the product from the database
    var model = Database.GetProductById(productId);

   // set a default if you want
   model.PriceChoice = "a";

    return View(model);
}

[HttpPost]
public ActionResult AddToCart(Product model)
{
    // do whatever you need to do

    return RedirectToAction("Details", new { id = model.Id });
}
}

Вид

 @using (Html.BeginForm())
{
<div>A: @Html.RadioButtonFor(x => x.PriceChoice , "a")</div>
<div>B: @Html.RadioButtonFor(x => x.PriceChoice , "b")</div>
@Html.ValidationMessageFor(x => x.PriceChoice )
<input type="submit" value="OK" />
}

Теперь все это очень кратко и просто, поэтому я надеюсь, что вы поняли суть.

Также вы найдете некоторое значение в чтении этого Post Redirect Get Так что, хотя это не строго относится к тому, что вы делаете, оно объяснит структуру кода, который вы читаете, в примерах, где Вы видите RedirectToAction.

Теперь, если вы хотите сделать это очень умно, вам придется изучить некоторый javascript и выполнить команду Ajax.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...