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 value
1 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" />
}
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)
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");
}
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
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
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.