【问题标题】:Access property of an object of type [Model] in JQueryJQuery 中 [Model] 类型对象的访问属性
【发布时间】:2015-08-23 07:06:41
【问题描述】:

所以在我的 MVC 项目中,我有一个名为 Survey 的自定义模型,其中包含一些属性。在调查控制器中,我将调查保存到会话变量中,以便调查属性的值在每个会话中保持不变。

我希望能够根据会话调查的属性值来操作视图的 DOM。但我在如何访问这些方面遇到了麻烦。

我确实发现了这个看起来非常相似但没有答案的相对较新的问题:Cannot access properties of model in javascript

这是我目前所拥有的:在视图中,我得到了这样的会话调查:

     <input type="hidden" name="activeS" value="@HttpContext.Current.Session("Survey")" />

然后在底部的部分脚本中,我有这个脚本来获取该值并对其进行处理:

 @Section Scripts
@Scripts.Render("~/bundles/jqueryval")

<script type="text/javascript">
    $(function () {
        var survey = $("[name=activeS]").val();
        $("[name=mddbccu][value=" + survey.mddbccu + "]").prop('checked', true);
    })
</script>

 End Section

如果我插入“警报(调查);”在“var调查...”之后它确实给了我一个警报,显示调查对象的类型。所以看起来调查正在被很好地检索。但如果我尝试“alert(survey.mddbccu);”警报只是说“未定义”。

请注意,我知道之后的行 ("$([name=mddbccu]...") 我知道有效 - 之前已将变量设置为特定值,使用该适当的项目进行检查。但在尝试获取调查的这个特定属性的值,没有任何检查。

那么我如何在此处获取调查属性的值?谢谢!

【问题讨论】:

  • 您的 javascript val() 只会返回一个字符串,而不是一个对象。如果 Session("Survey") 是 C# 对象,它将不包含您需要的属性。您必须将所需的各个调查属性序列化到单独的隐藏字段中或提出其他解决方案
  • @br4d - 谢谢。如果我将每个单独的属性序列化为视图中的隐藏字段,那么我将如何访问剃刀中的那些?或者您有其他解决方案的建议吗?
  • 如果视图本身根据会话发生变化,您可能需要考虑将该逻辑移动到 ViewModel 中(并将其填充到 Controller 的操作方法中),而不是只在视图中执行所有逻辑自己使用剃须刀。
  • @br4d - 如果我改用 ViewModels,我是否仍然没有必须根据会话变量的值指定检查哪些单选按钮的问题?我该怎么做呢?
  • 检查新答案

标签: javascript jquery asp.net-mvc session


【解决方案1】:

您的方法适用于一些骇客和变通方法,但它不符合 MVC 的精神。以下是如何以 MVC 方式完成它。基本上,您将所有繁重的工作(从会话中解析项目)0 移动到控制器并将结果存储在 ViewModel 中。这将逻辑排除在视图之外,并使代码更清晰、更容易维护。

如果您有 ViewModel:

public ActionResult Survey()
{
    SurveyViewModel model = new SurveyViewModel();

    Survey surveySession = HttpContext.Current.Session("Survey") as Survey; // youll have to do extra null checks and such here

    // map other properties from the survey object retrieved from the session to your viewmodel here!
    model.mddbccu = surveySession.mddbccu;
    model.otherProperty = surveySession.otherProperty

    return View(model);
}

如果您只是使用 Survey 对象作为视图内的模型,那么它就更简单了:

public ActionResult Survey()
{
    Survey model = HttpContext.Current.Session("Survey") as Survey;
    return View(model);
}

然后,MVC 会根据您在控制器中设置的内容神奇地为您选择内容。如果您使用的是@RadioButtonFor(m =&gt; m.mddbccu, "three"),那么如果将值“三”放入控制器的属性 mddbccu 中,则会选择收音机。

【讨论】:

  • 哦,伙计……这是一个更好的方法!我能够使用使 Survey 对象成为视图内的模型的方法来使其工作。我承认仍然有很多关于 MVC 的内容我并不完全理解……但这肯定有帮助。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2017-09-24
相关资源
最近更新 更多