Search code examples
asp.net-coreroutesutclocal-variables

Pass UTC offset into controller route


Fairly new to ASP.NET CORE, come from WPF background.

Having some trouble understanding how to pass local variables around.

I have a form:

<span id="clock"></span>
<form asp-action="Create" asp-controller="Session" method="post" asp-route-session="@Model.Session">
            <input asp-for="@Model.Session.ClientId" class="form-control" style="display: none" />
            <ejs-dropdownlist id="clinics" dataSource="@Model.LinkableClinics" placeholder="Select Clinic" popupHeight="220px" ejs-for="@Model.Session.ClinicId">
                <e-dropdownlist-fields text="Name" value="ClinicId"></e-dropdownlist-fields>
            </ejs-dropdownlist>
            <ejs-dropdownlist id="employees" dataSource="@Model.LinkableEmployees" placeholder="Select Employee" popupHeight="220px" ejs-for="@Model.Session.EmployeeId">
                <e-dropdownlist-fields text="Name" value="EmployeeId"></e-dropdownlist-fields>
            </ejs-dropdownlist>
            <ejs-datetimepicker id="startdatetimepicker" placeholder="Select a date and time" ejs-for="@Model.Session.StartTime"></ejs-datetimepicker>
            <ejs-datetimepicker id="enddatetimepicker" placeholder="Select a date and time" ejs-for="@Model.Session.EndTime"></ejs-datetimepicker>
            <div class="form-group">
                <input type="submit" value="Create Session" class="btn btn-primary" />
            </div>
        </form>

and I would like to add asp-route-offset to my form but I can't figure out how to pass a locally calculated variable into this routing.

This is a post, so I can't just use Url.Redirect() custom url builder.

I've also tried to add a hidden field and run a calculation inside the "value"

 <input asp-for="@Model.Session.Offset" class="form-control" style="display: none" value="getValue()"/>

I'm calculating my offset in my <script> section as follows:

<script type="text/javascript">

    window.onload = loaded;

    function loaded() {

        var clockElement = document.getElementById("clock");

        function updateClock(clock) {
            clock.innerHTML = new Date().getTimezoneOffset() / 60;

        }
    }
</script>

I've tried setting variables or the @Model object here, but nothing seems to want to stick.

Anyone have experience trying to pass a variable like this? Or a better way to pass UTC offset into my timestamp?


Solution

  • You're trying to mix and match things happening server-side and client-side. Your script which gets the offset runs client-side, after the server has sent the response. Your Razor code runs server-side, before the client has even received the page.

    Long and short, if you want to update the value, you have to do it via client-side means, namely JavaScript:

    document.getElementById('#Session_Offset').value = new Date().getTimezoneOffset();
    

    You can't use something like asp-route-offset at all, because the offset is coming from the client and can't be used to generate the post URL. As a result, you'll need to stick with the hidden input approach.