2016-08-13 51 views
0

对不起,如果它是一个新手问题,但任何人都可以告诉我为什么我不能将var的值设置为c#属性? 我试图找到一种方法,使用该值检索某些模特属性&做一个计算....在MVC视图中使用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和那些我打算用如此另一veriable设置:

@selection = selected; 

它仍然是0 !!!

我也无法理解为什么我不能使用任何类型的,如果@符号参与JavaScript变量的值,将appresiate的解释,如果你有时间或链接,以帮助.....

+0

你在哪里设置变量值?你是从一个JS变量设置值? – Shyju

+0

是...试图... $ el.on(“change”,@selection = selected); –

回答

0

您不能像您尝试的方式在客户端代码中设置C#变量值。因为当剃须刀执行时,它会执行其中的C#代码(在服务器),并将其结果(可能是字符串)发送给客户端以呈现页面所需的标记(检查视图页面的来源)。

所以如果你需要在你的服务器代码使用此,你需要做一个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); 
} 
+1

谢谢!!!!! –

+0

你碰巧知道如何用这种类型的语法向ActionResult发送多个参数?我需要从@HTML中提取日期值。编辑器选择的日期,但以你建议它将空白值拖入var(“”)的方式,可能是因为你选择用于提取值的函数是.text() - 我创建的ActionResult接受DateTime值来完成工作并返回一个int ... –

+0

**,因为您选择用于拉取该值的函数是.text()**。不,我从你的问题中复制它。通常我使用'val()'方法选择选项的值。没有看到你如何构建下拉列表,我不能告诉你使用'val()'!因此我复制了你现有的代码。是。您可以发送multipple项目,如果它只是您想要发送的另一个值,您可以将其作为另一个querystring项目发送。如果您必须发送更多数据,请将其更改为$ .post并发送您想要的任何内容。使用$ .post时没有限制。 – Shyju

1

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

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

...只需取C#selection值并执行替换。所以,如果selection设置为"foo"在C#,即输出是JavaScript:

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

change事件的事件处理语法,即使这没有工作不正确。另外,您不能让JavaScript为C#属性赋值。相反,JavaScript必须提交表单或执行AJAX请求才能将数据发送回服务器进行处理,并由MVC控制器处理。

0

简短回答: @意味着它是服务器代码,而不是客户端代码。它在页面发送给用户之前被执行。一旦服务器完成并且用户获得页面,JavaScript代码就会被执行。