我正在尝试将所选文件的完整路径设置到视图中的模型中。
Controller FileController:
public async Task<IActionResult> Create(CreateFileViewModel model)
{
if (ModelState.IsValid)
{
var file = new File
{
Path = model.Path
};
_context.Add(file);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(model);
}
模型CreateFileViewModel:
public class CreateFileViewModel
{
public string Path { get; set; }
}
模型文件:
public class File
{
public int Id { get; set; }
public string Path { get; set; }
}
ViewForm创建:
<form asp-action="Create">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Path" class="control-label"></label>
<input asp-for="Path" id="selectedFile" type="file" />
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</form>
创建脚本:
<script>
document.getElementById('selectedFile').onmouseout = function () {
@Model.Path=this.value;
};
</script>
但是
@Model.Path=this.value;
这不起作用。 Ofc我无法在剃刀和javascript变量之间进行转换。但我不知道如何将所选文件的完整路径设置到模型变量中。 此
<input asp-for="Path" id="selectedFile" type="file" />
设置为模型变量,只是文件名,没有路径。
答案 0 :(得分:0)
@Model.Path
是服务器端即c#代码,而this.value
是java脚本代码,它是客户端代码,因此服务器端代码将在js代码执行时呈现视图时执行你的HTML中的特殊事件。
你需要的是通过javascript更新隐藏值,它将在控制器中以更新的值发回,并且还将在带有更新值的html中工作。
您的隐藏字段将以ID Path
呈现,因此您可以写:
document.GetElementById("Model").value = this.value;
或者如果您的应用程序中包含jquery库,那么您也可以使用它:
$("#Path").val(this.value);
这样,当模型将回发到控制器时,Path
属性将具有更新的值,该值将是您通过js代码分配的路径。
希望它有所帮助!