web-dev-qa-db-fra.com

Comment passer une valeur de zone de texte d'une vue à un contrôleur dans MVC 4?

Ici, je vais chercher la valeur de la base de données et la montrer dans un champ de saisie

<input type="text" id="ss" value="@item.Quantity"/>

et la valeur extraite de la base de données est 1. Ensuite, je modifie la valeur du champ de saisie en 2 

 <a id="imgUpdate"  href="@Url.Action("Update", "Shopping", new { id = Request.QueryString["UserID"], productid = item.ProductID, qty = item.Quantity, unitrate = item.Rate })"> 

Mais dans la partie contrôleur, je reçois ce old value1 pour qty. Mais j'ai besoin de ce updated value 2 dans qty

public ActionResult Update(string id, string productid, int qty, decimal unitrate)
        {
            if (ModelState.IsValid)
            {
                int _records = UpdatePrice(id,productid,qty,unitrate);
                if (_records > 0)
                {
                    return RedirectToAction("Index1", "Shopping");
                }
                else
                {
                    ModelState.AddModelError("","Can Not Update");
                }
            }
            return View("Index1");
        }

Toute suggestion?

MODIFIER:

     @using (Html.BeginForm("Update", "Shopping", FormMethod.Post))
     {

                @Html.Hidden("id", @Request.QueryString["UserID"] as string)
                @Html.Hidden("productid", item.ProductID as string)
                @Html.TextBox("qty", item.Quantity)
                @Html.Hidden("unitrate", item.Rate)

                <input type="submit" value="Update" />
     }
9
bala3569

Vous pouvez utiliser un formulaire simple:

@using(Html.BeginForm("Update", "Shopping"))
{
    <input type="text" id="ss" name="qty" value="@item.Quantity"/>
    ...
    <input type="submit" value="Update" />
}

Et ajoutez ici l'attribut:

[HttpPost]
public ActionResult Update(string id, string productid, int qty, decimal unitrate)
10
webdeveloper

Lorsque vous souhaitez transmettre de nouvelles informations à votre application, vous devez utiliser le formulaire POST. Dans Razor, vous pouvez utiliser les éléments suivants

Voir le code:

@* By default BeginForm use FormMethod.Post *@
@using(Html.BeginForm("Update")){
     @Html.Hidden("id", Model.Id)
     @Html.Hidden("productid", Model.ProductId)
     @Html.TextBox("qty", Model.Quantity)
     @Html.TextBox("unitrate", Model.UnitRate)
     <input type="submit" value="Update" />
}

Actions du contrôleur

[HttpGet]
public ActionResult Update(){
     //[...] retrive your record object
     return View(objRecord);
}

[HttpPost]
public ActionResult Update(string id, string productid, int qty, decimal unitrate)
{
      if (ModelState.IsValid){
           int _records = UpdatePrice(id,productid,qty,unitrate);
           if (_records > 0){                    {
              return RedirectToAction("Index1", "Shopping");
           }else{                   
                ModelState.AddModelError("","Can Not Update");
           }
      }
      return View("Index1");
 }

Notez que si vous souhaitez utiliser @Html.TextBoxFor(model => model.Quantity), vous pouvez soit avoir une entrée avec le nom (respectant la casse) "Quantity", soit modifier votre POST Update () pour recevoir un paramètre d'objet, qui serait du même type votre vue strictement typée. Voici un exemple:

Modèle

public class Record {
    public string Id { get; set; }
    public string ProductId { get; set; }
    public string Quantity { get; set; }
    public decimal UnitRate { get; set; }
}

Vue

@using(Html.BeginForm("Update")){
     @Html.HiddenFor(model => model.Id)
     @Html.HiddenFor(model => model.ProductId)
     @Html.TextBoxFor(model=> model.Quantity)
     @Html.TextBoxFor(model => model.UnitRate)
     <input type="submit" value="Update" />
}

Post Action

[HttpPost]
public ActionResult Update(Record rec){ //Alternatively you can also use FormCollection object as well 
   if(TryValidateModel(rec)){
        //update code
   }
   return View("Index1");
}
3
Pierluc SS

votre lien est généré lorsque la page charge, il aura donc toujours la valeur d'origine. Vous devrez définir le lien via javascript

Vous pouvez aussi simplement envelopper cela dans un formulaire et avoir des champs cachés pour id, productid et unitrate

Voici un échantillon pour toi.

HTML

<input type="text" id="ss" value="1"/>
<br/>
<input type="submit" id="go" onClick="changeUrl()"/>
<br/>
<a id="imgUpdate"  href="/someurl?quantity=1">click me</a>

JS

function changeUrl(){
   var url = document.getElementById("imgUpdate").getAttribute('href');
   var inputValue = document.getElementById('ss').value;
   var currentQ = GiveMeTheQueryStringParameterValue("quantity",url);
    url = url.replace("quantity=" + currentQ, "quantity=" + inputValue);
document.getElementById("imgUpdate").setAttribute('href',url)
}

    function GiveMeTheQueryStringParameterValue(parameterName, input) {
    parameterName = parameterName.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + parameterName + "=([^&#]*)");
    var results = regex.exec(input);
    if (results == null)
        return "";
    else
        return decodeURIComponent(results[1].replace(/\+/g, " "));
}

cela pourrait être nettoyé et étendu comme vous en avez besoin, mais l'exemple fonctionne

2
Eonasdan

Essayez ce qui suit dans votre vue pour vérifier le résultat de chacun. Le premier est mis à jour lorsque la vue est appelée une seconde fois. Mon contrôleur utilise la clé ShowCreateButton et possède le paramètre facultatif _createAction avec une valeur par défaut. Vous pouvez le remplacer par votre clé/paramètre.

@Html.TextBox("_createAction", null, new { Value = (string)ViewBag.ShowCreateButton })
@Html.TextBox("_createAction", ViewBag.ShowCreateButton )
@ViewBag.ShowCreateButton
1
michael.2.williams

Je vais juste essayer de répondre à la question, mais mes exemples sont très simples car je suis nouveau à MVC. J'espère que cela aidera quelqu'un.

    [HttpPost]  ///This function is in my controller class
    public ActionResult Delete(string txtDelete)
    {
        int _id = Convert.ToInt32(txtDelete); // put your code           
    }

Ce code est dans le cshtml de mon contrôleur 

  >   @using (Html.BeginForm("Delete", "LibraryManagement"))
 {
<button>Delete</button>
@Html.Label("Enter an ID number");
@Html.TextBox("txtDelete")  }  

Assurez-vous simplement que le nom de la zone de texte et l'entrée de la fonction de votre contrôleur ont le même nom et le même type (chaîne). De cette façon, votre fonction obtiendra l'entrée de la zone de texte. 

0
sssD