1

我是 web 开发的 mvc 方式的新手,我有一个带有两个动作索引和保存的主控制器和一个名为 MyModel 的模型和一个静态类 SomeData,它将 MyModel 作为属性 - SomeData 是一个具有静态属性 MyModel 的静态类(即我拥有的模型类的类型)和一个静态方法 getdata(),它返回对 ModelClass 的引用

public static MyModel MyModels;

    static SomeData()
    {
        MyModels = new MyModel { SomeValue = 100 , SomeString="ComingFromSomeData"};

    }

    public static MyModel getdata()
    {
        return MyModels;
    }

下面是两个动作方法,现在发生的是在启动动作索引调用getdata方法并绑定模型,我可以看到数据但是当我更改值并单击保存时,它又回到动作“保存”并修改传递的属性(添加 100 并添加“bro”)并尝试再次将模型绑定到“保存”视图(保存视图类似于 Index 视图,除了它还有一个 ActionLink ,它再次导航到 Index 视图) ,问题是在“保存”视图中,我看不到更改值,但是如果我单击操作链接并再次转到索引视图,我可以看到更改的值(已存储在静态类中)

 public ActionResult Index()
    {
        MyModel M = SomeData.getdata();
        return View(M);
    }

    [HttpPost]
    public ActionResult Save(ValidationPractice.Models.MyModel M)
    {
        if (ModelState.IsValid)
        {
            SomeData.MyModels.SomeValue = M.SomeValue + 100;
            SomeData.MyModels.SomeString = M.SomeString+" bro";
        }
        MyModel whosemodel = SomeData.getdata();
        //return View("Index", whosemodel)
        return View(whosemodel);
    }

和模型如下

 public class MyModel
{
    private int _somevalue;

    [Required]
    public int SomeValue
    {
        get { return _somevalue; }
        set { _somevalue = value; }
    }
    [Required]
    public string SomeString
    {
        get;
        set;
    }

}

和索引视图如下

@model ValidationPractice.Models.MyModel
<form action="Home\Save" method="post">
    <label>SomeLabel</label>&nbsp&nbsp
    @Html.EditorFor(model => model.SomeValue)
    @Html.EditorFor(model=>model.SomeString)

    <input type="submit" />
</form>

和保存视图如下 -

@model ValidationPractice.Models.MyModel
<form action="Home\Save">
<label>SomeLabel</label>&nbsp&nbsp
@Html.EditorFor(@model => model.SomeValue)
@Html.EditorFor(@model=>model.SomeString) <br />
@Model.SomeString
@Model.SomeValue<br />
<input type="submit" />
@Html.ActionLink("Clicktoreturn", "Index");

需要注意的一点是 @Model.SomeString ,@Model.SomeValue 返回更新的值,即 200 和 ComingFromSomeDataBro 但绑定的模型 lambda 表达式 @model=> model.SomeString 不...为什么会发生?

4

3 回答 3

1

首先,在 Web 应用程序中避免几乎任何静态的东西(除了一些例外,比如扩展方法)。

原因是静态不仅在用户的多个 Web 请求之间共享,而且在用户之间共享。因此,如果您有两个用户访问您的网站,他们都将访问该静态数据,您将获得不可预测的结果。

其次,您应该使用 Html.BeginForm 助手而不是使用 html 表单标签。

第三,您没有正确设置表单标签。"Home\Save" 是错误的斜线开头,它应该是 "Home/Save" 并且它也是相对于 url 的。因此,如果您当前的 URL 是 /Home/Index,那么当您单击提交按钮时,它将尝试提交到 /Home/Index/Home\Save。如果您使用 / 实际呈现 /Home/Index 的默认页面行为,这可能会起作用,但是一旦您使用不同的 url,它就会失败。

这就是为什么你应该使用助手的原因,因为它们会为你找出正确的路径。

于 2013-08-04T09:24:05.427 回答
0

查看您的 SomeData.. 使用 SomeData.Init() 在使用前明确初始化 MyModels.. 试一试。

public static class SomeData
{
    public static MyModel MyModels;
    public static Boolean Init()
    {
       SomeData.MyModels = new MyModel { SomeValue = 100 , SomeString="ComingFromSomeData"};
       return true;
    }

    public static void AddValue(int AValue) 
    {
       SomeData.MyModels.SomeValue += AValue;
    }

    public static void AppendString(string AString) 
    {
       SomeData.MyModels.SomeString += AString;
    }

    public static MyModel getData()
    {
       return SomeData.MyModels;
    }
}
于 2013-07-20T17:16:09.960 回答
0

更新:您以错误的方式使用模型绑定:

@Html.EditorFor(@model => model.SomeValue) //
@Html.EditorFor(@model=>model.SomeString)  // What is @model...?! just model!

更正您的 Svae 视图,如下所示:

@model ValidationPractice.Models.MyModel
<form action="Home\Save">
<label>SomeLabel</label>&nbsp&nbsp
@Html.EditorFor(model => model.SomeValue)
@Html.EditorFor(model=>model.SomeString) <br />
@Model.SomeString
@Model.SomeValue<br />
<input type="submit" />
@Html.ActionLink("Clicktoreturn", "Index");

而且,下一次,记得在你的问题中添加足够多的相关代码;)

于 2013-07-30T06:51:37.170 回答