【问题标题】:ASP.Net MVC Update ViewModel on DropDown Selection changedASP.Net MVC Update ViewModel on DropDown Selection 已更改
【发布时间】:2015-03-25 13:33:09
【问题描述】:

起初,我对 Web 开发完全陌生。我正在尝试开发一个由单个页面组成的 Web 应用程序(我从一个尝试遵循 mvc 模式的空项目开始)。

为了填充我的视图,我通过 HomeController 将 ViewModel 传递给我的“主页”视图。

现在我想根据下拉选择更改一些标签文本。

视图模型:

public IEnumerable<Models.Language> AvailableLanguages;
public Models.Language SelectedLanguage
Public IEnumerable<Models.Text> Content;

语言:

public int ID;
public string LanguageText;

文字:

public Language Language;
public string Description;

HTML: @model ViewModels.MyViewModel

<div>
    @Html.DropDownFor(x => x.AvailableLanguages, 
    new SelectList(Model.AvailableLanguages, 
    "ID", 
    "LanguageText", 
    new {@onchange= ... })) 
</div>

<div>
    @{
        @:@Model.MyViewModel.Content
        .Where(o => o.Language.Equals(Model.SelectedLanguage)
        .First())
        .Description
     }
</div>

我读过一些关于这个“@onchange”属性(Ajax、JQuery)的东西——但老实说,如果有任何 ASP/MVC/HTML 解决方案来实现我的目标,那就太好了——每次都更新我的 SelectedLanguage 属性下拉列表中的选定项目已更改。

另外:有没有web开发(asp、html、ajax、jquery、js)的教程可以推荐?

谢谢!

编辑

现在我尝试实现提供的代码,但更改所选项目时似乎没有任何反应...

脚本:

<div class="LanguageSelection">
        @{
            @Html.DropDownList("SelectedLanguage", new SelectList(Model.AvailableLanguages, "ID", "Description"))
            <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript">
                var url = '@Url.Action("ChangeLanguage", "Home")';
                $('#SelectedLanguage').change() {
                    $.getJSON(url, {
                        ID: $(this).val() 
                    }, function(response){
                        $('#Title').text(response.Title);   
                    });
                };
            </script>
        }
    </div>

JsonResult:

public JsonResult ChangeLanguage(int id) {
        var data = new {
            Title = HVM.Title.Where(o => o.Language.ID.Equals(id)).First(),
        };
        return Json(new { success = true });
    }

问题应该在脚本中的某个地方,ChangeLanguage 方法甚至没有被执行。

【问题讨论】:

  • 你试过javascript/jquery解决方案了吗?
  • 有点不清楚你到底想做什么。您不能将下拉列表绑定到复杂对象 (IEnumerable&lt;Models.Language&gt;)。如果您想在回发时识别所选语言,则需要绑定一个属性(比如int SelectedLanguage { get; set; }),然后是@Html.DropDownFor(x =&gt; x.SelectedLanguage, new SelectList(Model.AvailableLanguages ...)
  • 您的观点的第二部分没有意义。 Razor 代码在发送到视图之前在服务器上进行解析,因此MyViewModel.Content 永远只是SelectedLanguage 的初始值。如果您想根据所选语言更新 DOM 中的某些内容,则需要使用 ajax 调用控制器,传递所选语言并返回要显示的新值。另请注意,您的模型只有字段(没有获取/设置),因此当您回发时不会绑定任何内容。
  • 这就是为什么我说我是网络开发领域的新手。所以您的意思是如果不使用 ajax 等高级技术,就无法将 SelectedValue 绑定到 List?如果是这样,你能推荐一些教程吗?
  • @Chill-X。您可以将下拉列表绑定到值类型(intstring 等),但不能绑定到复杂对象(&lt;select&gt; 回发单个值并且不知道 IEnumerable&lt;Language&gt; 是什么。如果您解释你想做什么(即处理.change事件的目的是什么),我可以给你答案。

标签: c# html asp.net-mvc viewmodel onchange


【解决方案1】:

在 cmets 中,您希望能够根据所选语言更新标签。为此,您需要使用 ajax 将所选语言发布到返回 json 并更新 DOM 的控制器方法。你的视图模型应该是

public SelectList AvailableLanguages { get; set; }
public int SelectedLanguage { get; set; }

在控制器中

public ActionResult YourMethod()
{
  var model = new yourModel();
  model.SelectedLanguage = // set this if you want a default
  var availableLanguages = // get you list of languages
  model.AvailableLanguages = new SelectList(availableLanguages, "ID", "LanguageText")
  return View(model);
}

查看

@Html.DropDownListFor(m => m.SelectedLanguage, Model.AvailableLanguages)

<script>
  var url = '@Url.Action("GetLanguageLabels", "yourControllerName")';
  $('#SelectedLanguage').change() {
    $.getJSON(url, { ID: $(this).val() }, function(response) {
      // Note you will need to give your labels an id attribute
      $('#Label1').text(response.Label1);
      $('#Label2').text(response.Label2);
    })
  });
</script>

以及根据所选语言获取标签的方法

public JsonResult GetLanguageLabels(int ID)
{
  // Build a object of label values based on the selected language ID
  var data = new
  {
    Label1 = someValue,
    Label2 = anotherValue,
    ....
  };
  return Json(data, JsonRequestBehavior.AllowGet);
}

旁注:您当前的代码存在一些问题。 (1) 您的模型只有字段,没有属性(没有获取/设置),因此回发时不会绑定任何内容。 (2) 不能将 html 控件绑定到复杂对象(只能是值类型,或者在&lt;select multiple&gt; 的情况下,是值类型的数组)。

【讨论】:

  • 谢谢,我会尽快实施。你能解释一下
  • 好的,您需要包含jquery.{version}.js 文件(使用捆绑或来自Scripts 文件夹)。并且您需要更新一些内容以满足您的要求(例如yourControllerName 和标签的 id,因为您没有提供足够的信息)。如果您有任何问题,请发布您尝试过的代码。在您尝试之前,您不应该将答案标记为已接受:)
  • 我添加了更多代码 - 也许你可以再帮忙一次?提前致谢!
  • 如果您的新代码有问题,您需要提出一个新问题。有很多问题 - 将脚本放在页面底部的 &lt;script&gt; 标记内。 jquery 引用需要是单独的脚本标记。您的方法返回return Json(new { success = true });,但它必须是return Json(data, JsonRequestBehavior.AllowGet)。在脚本上放置断点,控制器方法调试您的代码以了解实际发生的情况
  • 谢谢,终于你做到了:) 现在它(几乎)按预期工作了。我可以问最后一个问题吗?我想在我的 ChangeLanguage 方法中使用我的 HomeViewModel - 但是那里的引用为空,尽管我在我的索引方法中创建了一个实例 (this.ViewModel = new HomeViewModel();)
【解决方案2】:

你会确保元素在一个表单中,并且在 onchange 之后是函数的名称......

@onchange="submitdata();"

然后您将添加脚本。

function submitdata()
{
  $('form').submit();
}

对于更“MVC”的方法,您将从使用模型的强类型视图开始。

@model My.Path.To.Model

您还可以使用...将表单数据包装在您的剃须刀页面上

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post)){
     //form and inputs here, ect
     <form method="POST" action="" >
         //properties bound to inputs to change your model, or html helpers like display for...
         <input type="Submit" name="Submit" value="Submit"/>
     </form>
}

然后,您将模型作为参数传递给 Controller 操作,这在提交表单时调用:

[HttpPost]
 public FileStreamResult myMethod(Model model)
 {
     string str = model.imapropertyonthemodel;

 }

如果您是 MVC 新手,我建议您从 W3 schools 的基础知识开始,或者如果您有复数知识,那里有一些很棒的教程。

【讨论】:

  • 如果我理解您的 sn-p 表单(顺便说一句。我什么时候必须使用表单?)在单击表单上的按钮后提交。我想要做的是在更改下拉列表的选择后更新我的完整视图(如果可能,不清除我页面上的输入字段)。
  • 对不起,我不是更清楚。前几行回答了这个问题。您将拥有从@onchange 调用的javascript 函数。因此,当下拉列表更改时,表单将被“提交”,然后您可以从那里访问您想要的任何值。您根本不必使用按钮。除了可以访问所有值之外,事件还会在 javascript 中捕获,因此您可以对视图执行任何操作。
猜你喜欢
  • 2017-10-22
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多