在MVC视图中使用c#属性时没有设置变量

本文关键字:设置 变量 属性 视图 MVC | 更新日期: 2023-09-27 18:02:22

我很抱歉,如果这是一个新手的问题,但谁能告诉我为什么我不能设置一个变量值为c#属性?我正试图找到一种方法来使用值来检索一些模型属性&计算一下....

@using System.Collections
@using System.Runtime.Serialization
@using CarRentalMVCApp.Models
@model CarRentalMVCApp.Models.Rentals

@functions {
    public string selection { get; set; }
    public decimal Price { get; set; }
}
@{
ViewBag.Title = "Create";
}

<script>
function select() {
    var $el = $("#selectedCar");
    var selected = $("#selectedCar option:selected").text();
    $el.on("change", @selection = selected);
    alert(@selection); 
}
function Rental() {
    var choice = select();
    @foreach (var car in ViewData["availableCars"] as IEnumerable<Vehicles>)
    {
        if (selection != null && int.Parse(selection) == car.מספר_רכב)
        {
            Price = car.עלות_ליום_השכרה;
        }
    }
    if (firstDay != null && lastDay != null) {
        var rentalData = {
            price: @Price,
            firstDay: $("#beginRental").val(),
            lastDay: $("#endRental").val()
        }
        alert(rentalData);
    }
}
</script>

@selection总是等于0,我试着用另一个变量来设置它,像这样:

@selection = selected;

仍然是0 !!

我也不明白为什么我不能使用任何类型的javascript变量,如果@符号涉及,将感激一个解释,如果你有时间或链接帮助.....

在MVC视图中使用c#属性时没有设置变量

MVC视图只是模板;c#和JavaScript之间没有任何形式的互操作。相反,c#变量只会导致文本替换。因此,这些行:

$el.on("change", @selection = selected);
alert(@selection); 

…简单地取c# selection值并执行替换。因此,如果在c#中将selection设置为"foo",则输出的JavaScript为:

$el.on("change", foo = selected);
alert(foo); 

change事件的事件处理程序语法是不正确的,即使这确实工作。另外,你不能让JavaScript给c#属性赋值。相反,JavaScript必须提交表单或执行AJAX请求将数据发送回服务器进行处理,然后由MVC控制器处理。

您不能像您尝试的那样在客户端代码中设置c#变量值。因为当razor执行时,它执行其中的c#代码(at server),其结果(可能是字符串)将被发送到客户端以呈现页面所需的标记。(查看页面的视图源)。

如果你需要在服务器代码中使用这个,你需要进行ajax调用并将其发送到服务器

因此,如果您想要所选项目值的价格,请对服务器进行ajax调用并发送所选选项值,并使用该值计算价格并返回它。

var selected = $("#selectedCar option:selected").text();
$.get("@Url.Action("GetPrice","Home")"?id="+selected ,function(res){
    alert("Price of selection" + res);
});

假设GetPrice接受名为id的参数并返回价格

public ActionResult GetPrice(int id)
{
  // based on this id, Get the corresponding price
  decimal price = 100.0M; //replace with your value from db
  return Json(price,JsonRequestBehavior.AllowGet);
}

简短的回答:@表示它是服务器代码,而不是客户端代码。它在页面发送给用户之前执行。一旦服务器完成并且用户获得页面,javascript代码将被执行。