【问题标题】:Null value on POST in ASP.NET MVCASP.NET MVC 中 POST 的空值
【发布时间】:2015-12-20 17:48:16
【问题描述】:

我正在学习 ASP.NET MVC,但遇到以下问题。

视图“SelectProdotti”是

@model Models.SelectProdottiModel

@{
    ViewBag.Title = "Select Prodotti";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm("ProdottiToListino", "Listino", FormMethod.Post))
{ 


    @Html.HiddenFor(m => m.id)
    @Html.DisplayFor(m=> m.id)


    <input type="submit" value="Salva" />
}

加载视图的动作

public ActionResult SelectProdotti(int id)
        {


            SelectProdottiModel model = new SelectProdottiModel();
            model.id = id;         

            return View(model);
        }

型号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Models
{
    public class SelectProdottiModel
    {


        public int id;

        public SelectProdottiModel()
        {                
        }
    }
}

控制器中的发布操作

[HttpPost]
        public ActionResult ProdottiToListino(SelectProdottiModel model)
        {

            return RedirectToAction("SelectProdotti", "Listino", new {id = model.id });
        }

我写这段代码只是为了学习,没用。问题是model.id始终为0,即视图不发布值,错误在哪里?

【问题讨论】:

  • public int id 是一个字段。默认的模型绑定器甚至不会尝试绑定它。尝试使用 propertypublic int id { get; set; }

标签: c# asp.net-mvc


【解决方案1】:

目前Id 是您的类的一个字段,没有 GETTER/SETTER 属性/方法。

Fields 通常用于在类内部存储数据(这些数据将具有默认私有可见性)。通常,字段的值将通过另一个公共属性或方法设置/读取。使用C# properties,这更容易,如果你想让一个字段可读可写,你可以创建一个公共属性,如

public int Age {set;get;}

当您从表单发布数据时,DefaultModelBinder(将表单数据映射到类对象的类)将尝试创建SelectProddottiModel 类的对象并尝试设置匹配的公共属性的值与发布的表单数据中的表单项的名称。如果您没有使用set 访问器将您的字段设置为公共属性,则模型绑定器无法设置该值。

将您的字段Id 更改为具有setget 的属性,以便ModelBinder 可以从发布的表单数据中设置值。

public class SelectProdottiModel
{
    public int id {set;get;}       
}

此外,C# 通常使用 PascalCasing。所以我建议你把你的id属性改成Id

【讨论】:

  • 不正确 - C# 属性通常为 Pascal case, not Camel case。 C# 字段通常是 ​​Camel 大小写。
  • @NightOwl888 哎呀!我用错了。感谢您的关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2013-04-09
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多