【问题标题】:asp.mvc view model not persisting newly assigned data when passed into view from httppost Controller从 httppost 控制器传递到视图时,asp.mvc 视图模型不会保留新分配的数据
【发布时间】:2014-04-03 18:25:57
【问题描述】:

每当我运行此代码时,我在将结果从控制器传递到从 httppost 方法查看时都会遇到问题。服务器端代码很好,只是当我在计算器中分配新结果时。结果属性我永远不会在视图的文本框中看到新分配的值。其余属性填充了适当的值。

谁能帮我解决这个问题?还是我错过了什么?

谢谢

这是我的 .cshtml 代码

    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
        <div class="row">
            <div class="span2">
                @Html.LabelFor(x => x.FirstNumber)
            </div>
            <div class="span2">
                @Html.TextBoxFor(x => x.FirstNumber)
            </div>
            <div class="field-validation-error">
                @Html.ValidationMessageFor(x => x.FirstNumber)
            </div>
        </div>
        <br />
        <div class="row">
            <div class="span2">
                @Html.LabelFor(x => x.SecondNumber)
            </div>
            <div class="span2">
                @Html.TextBoxFor(x => x.SecondNumber)
            </div>
            <div class="field-validation-error">
                @Html.ValidationMessageFor(x => x.SecondNumber)
            </div>
        </div>
        <br />
        <div class="row">
            <div class="span2">
                @Html.LabelFor(x => x.SelectedFunction)
            </div>
            <div class="span2">
                @Html.DropDownListFor(x => x.SelectedFunction, Model.Functions, "Please Make a Selection")
            </div>
            <div class="field-validation-error">
                @Html.ValidationMessageFor(x => x.SelectedFunction)
            </div>
        </div>
        <br/>
        <div class="row">
            <div class="span2">
                @Html.Label("Result: ")
            </div>
            <div class="span2">
                @Html.TextBoxFor(x => x.Result)
            </div>
        </div>
        <br />
        <div class="row">
            <input type="submit" value="Load" />
        </div>

    }

这是我的控制器代码

  [HttpPost]
    public ActionResult Index(CalculatorViewModels calculator)
    {
        //If the entries are valid
        if (ModelState.IsValid)
        {

            try
            {
                double firstNum = calculator.FirstNumber;
                double secondNum = calculator.SecondNumber;
                string selectedFunction = calculator.SelectedFunction;

                double result = -1;
                if (selectedFunction.Equals("1"))
                {
                    result = service.CombinedWith(firstNum, secondNum);
                }
                else if (selectedFunction.Equals("2"))
                {
                    result = service.Either(firstNum, secondNum);
                }

               calculator.Result = Convert.ToString(result);

                return View(calculator);
            }
            catch(Exception ex)
            {
               calculator.Result = "Error in calculating probability "+ex.Message;
                return View(calculator);
            }
        }

        //entries are not valid 
        else
        {
            return View(calculator);
        }

    }

这是我的视图模型

公共类 CalculatorViewModels {

    [Required(ErrorMessage = "Please enter a Number between zero and one")]
    [Display(Name = "FirstNumber")]
    [Range(0, 1)]
    public double FirstNumber { get; set; }

    [Required(ErrorMessage = "Please enter a Number between zero and one")]
    [Display(Name = "Second Number")]
    [Range(0, 1)]
    public double SecondNumber { get; set; }

    [Required(ErrorMessage = "Please Select at least one function")]
    [Display(Name="Please Select a Function")]
    public string SelectedFunction { get; set; }

    //will be used to report exception as well if needed 
    public string Result { get; set; }

    public List<SelectListItem> Functions
    {
        get
        {
            return new List<SelectListItem>()
            {
                new SelectListItem{ Text="CombinedWith",Value="0"},
                new SelectListItem{Text="Either",Value="1"}
            };

        }
    }


}

【问题讨论】:

  • 对于踢腿和咯咯笑,添加一个“字符串 testResult =calculator.Result;”在“calculator.Result = Convert.ToString(result);”之后并添加一个断点以确保该值实际上已分配给模型
  • @dave k 我已经这样做了。不过,可以使用一种解决方法来查看包
  • 你确定你没有抛出异常吗?我们不知道什么是“服务”或方法是做什么的。尝试注释掉 try/catch 块,看看是否引发了任何异常。
  • 这很可能是 ModelState 在使用 HTML 帮助程序时优先于您的模型的结果。您需要使用ModelState.Remove() 清除ModelState["Result"]。参见例如stackoverflow.com/questions/17680982/… 以获得更详尽的解释。
  • 哇,一个小时内有 2 个答案,对于一个一年前的问题......

标签: asp.net .net asp.net-mvc web


【解决方案1】:

在视图的顶部,转储模型的内容只是为了进行健全性检查。使用 HTML.Raw(..) 什么的,然后查看页面源代码来检查结果是否真的被设置了。

有点像

@{
    var model = @Html.Raw(Json.Encode(Model));
}

使用 JavaScript 将模型写到控制台什么的。

让我知道你的进展情况以及结果是否已经确定。

【讨论】:

    【解决方案2】:

    试试这个方法...

    1) 更新您的视图,为提交按钮添加一个点击处理程序并在 javascript 中处理它

    @using (Html.BeginForm())
        {
            @Html.ValidationSummary(true)
            <div class="row">
                <div class="span2">
                    @Html.LabelFor(x => x.FirstNumber)
                </div>
                <div class="span2">
                    @Html.TextBoxFor(x => x.FirstNumber)
                </div>
                <div class="field-validation-error">
                    @Html.ValidationMessageFor(x => x.FirstNumber)
                </div>
            </div>
            <br />
            <div class="row">
                <div class="span2">
                    @Html.LabelFor(x => x.SecondNumber)
                </div>
                <div class="span2">
                    @Html.TextBoxFor(x => x.SecondNumber)
                </div>
                <div class="field-validation-error">
                    @Html.ValidationMessageFor(x => x.SecondNumber)
                </div>
            </div>
            <br />
            <div class="row">
                <div class="span2">
                    @Html.LabelFor(x => x.SelectedFunction)
                </div>
                <div class="span2">
                    @Html.DropDownListFor(x => x.SelectedFunction, Model.Functions, "Please Make a Selection")
                </div>
                <div class="field-validation-error">
                    @Html.ValidationMessageFor(x => x.SelectedFunction)
                </div>
            </div>
            <br/>
            <div class="row">
                <div class="span2">
                    @Html.Label("Result: ")
                </div>
                <div class="span2">
                    @Html.TextBoxFor(x => x.Result)
                </div>
            </div>
            <br />
            <div class="row">
                <input type="button" value="Load" id="btnSubmit" onclick="submitForm();"/>
            </div>
    
        }
    
    <script src="~/Scripts/jquery-2.1.3.js"></script>
    <script type="text/javascript">
        var url = '@Url.Action("Index")';
    
        function submitForm() {
            var data = {};
            data.FirstNumber = $('#FirstNumber').val();
            data.SecondNumber = $('#SecondNumber').val();
            data.SelectedFunction = $('#SelectedFunction').val();
            $.post(url, data).done(function (result) {
                $('#Result').val(result);
            });
        }
    
    
    </script>
    

    修改控制器返回Json数据

    using Newtonsoft.Json;
    ..
    ..
    
    [HttpPost]
            public ActionResult Index(CalculatorViewModels calculator)
            {
                //If the entries are valid
                if (ModelState.IsValid)
                {
    
                    try
                    {
                        double firstNum = calculator.FirstNumber;
                        double secondNum = calculator.SecondNumber;
                        string selectedFunction = calculator.SelectedFunction;
    
                        double result = -1;
                        if (selectedFunction.Equals("1"))
                        {
                            result = service.CombinedWith(firstNum, secondNum);
                        }
                        else if (selectedFunction.Equals("2"))
                        {
                            result = service.Either(firstNum, secondNum);
                        }
    
                        calculator.Result = Convert.ToString(result);
    
                        return Json(result);
                    }
                    catch (Exception ex)
                    {
                        calculator.Result = "Error in calculating probability " + ex.Message;
                        return Json(0);
                    }
                }
    
                //entries are not valid 
                else
                {
                    return Json(0);
                }
    
            }
    

    不要忘记将 jQuery 库添加到脚本文件夹并添加对 Newtonsoft.Json 的引用。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多