将所选文件的路径设置为视图中的模型

时间:2017-11-24 12:20:06

标签: javascript c# asp.net entity-framework razor

我正在尝试将所选文件的完整路径设置到视图中的模型中。

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" />

设置为模型变量,只是文件名,没有路径。

1 个答案:

答案 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代码分配的路径。

希望它有所帮助!